phy-msm-usb.c 44.4 KB
Newer Older
1
/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
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
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 *
 */

#include <linux/module.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/err.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/ioport.h>
#include <linux/uaccess.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
32
#include <linux/pm_runtime.h>
33 34
#include <linux/of.h>
#include <linux/of_device.h>
35
#include <linux/reset.h>
36 37 38

#include <linux/usb.h>
#include <linux/usb/otg.h>
39
#include <linux/usb/of.h>
40 41 42 43 44
#include <linux/usb/ulpi.h>
#include <linux/usb/gadget.h>
#include <linux/usb/hcd.h>
#include <linux/usb/msm_hsusb.h>
#include <linux/usb/msm_hsusb_hw.h>
45
#include <linux/regulator/consumer.h>
46 47 48 49 50

#define MSM_USB_BASE	(motg->regs)
#define DRIVER_NAME	"msm_otg"

#define ULPI_IO_TIMEOUT_USEC	(10 * 1000)
51
#define LINK_RESET_TIMEOUT_USEC	(250 * 1000)
52 53 54 55 56 57 58 59 60 61 62 63 64

#define USB_PHY_3P3_VOL_MIN	3050000 /* uV */
#define USB_PHY_3P3_VOL_MAX	3300000 /* uV */
#define USB_PHY_3P3_HPM_LOAD	50000	/* uA */
#define USB_PHY_3P3_LPM_LOAD	4000	/* uA */

#define USB_PHY_1P8_VOL_MIN	1800000 /* uV */
#define USB_PHY_1P8_VOL_MAX	1800000 /* uV */
#define USB_PHY_1P8_HPM_LOAD	50000	/* uA */
#define USB_PHY_1P8_LPM_LOAD	4000	/* uA */

#define USB_PHY_VDD_DIG_VOL_MIN	1000000 /* uV */
#define USB_PHY_VDD_DIG_VOL_MAX	1320000 /* uV */
65 66 67 68 69 70 71
#define USB_PHY_SUSP_DIG_VOL	500000  /* uV */

enum vdd_levels {
	VDD_LEVEL_NONE = 0,
	VDD_LEVEL_MIN,
	VDD_LEVEL_MAX,
};
72 73 74 75 76 77

static int msm_hsusb_init_vddcx(struct msm_otg *motg, int init)
{
	int ret = 0;

	if (init) {
78
		ret = regulator_set_voltage(motg->vddcx,
79 80
				motg->vdd_levels[VDD_LEVEL_MIN],
				motg->vdd_levels[VDD_LEVEL_MAX]);
81
		if (ret) {
82
			dev_err(motg->phy.dev, "Cannot set vddcx voltage\n");
83 84 85
			return ret;
		}

86
		ret = regulator_enable(motg->vddcx);
87
		if (ret)
88
			dev_err(motg->phy.dev, "unable to enable hsusb vddcx\n");
89
	} else {
90
		ret = regulator_set_voltage(motg->vddcx, 0,
91
				motg->vdd_levels[VDD_LEVEL_MAX]);
92
		if (ret)
93
			dev_err(motg->phy.dev, "Cannot set vddcx voltage\n");
94
		ret = regulator_disable(motg->vddcx);
95
		if (ret)
96
			dev_err(motg->phy.dev, "unable to disable hsusb vddcx\n");
97 98 99 100 101 102 103 104 105 106
	}

	return ret;
}

static int msm_hsusb_ldo_init(struct msm_otg *motg, int init)
{
	int rc = 0;

	if (init) {
107
		rc = regulator_set_voltage(motg->v3p3, USB_PHY_3P3_VOL_MIN,
108 109
				USB_PHY_3P3_VOL_MAX);
		if (rc) {
110
			dev_err(motg->phy.dev, "Cannot set v3p3 voltage\n");
111
			goto exit;
112
		}
113
		rc = regulator_enable(motg->v3p3);
114
		if (rc) {
115
			dev_err(motg->phy.dev, "unable to enable the hsusb 3p3\n");
116
			goto exit;
117
		}
118
		rc = regulator_set_voltage(motg->v1p8, USB_PHY_1P8_VOL_MIN,
119 120
				USB_PHY_1P8_VOL_MAX);
		if (rc) {
121
			dev_err(motg->phy.dev, "Cannot set v1p8 voltage\n");
122
			goto disable_3p3;
123
		}
124
		rc = regulator_enable(motg->v1p8);
125
		if (rc) {
126
			dev_err(motg->phy.dev, "unable to enable the hsusb 1p8\n");
127
			goto disable_3p3;
128 129 130 131 132
		}

		return 0;
	}

133
	regulator_disable(motg->v1p8);
134
disable_3p3:
135
	regulator_disable(motg->v3p3);
136
exit:
137 138 139
	return rc;
}

140
static int msm_hsusb_ldo_set_mode(struct msm_otg *motg, int on)
141 142 143 144
{
	int ret = 0;

	if (on) {
145
		ret = regulator_set_optimum_mode(motg->v1p8,
146 147
				USB_PHY_1P8_HPM_LOAD);
		if (ret < 0) {
148
			pr_err("Could not set HPM for v1p8\n");
149 150
			return ret;
		}
151
		ret = regulator_set_optimum_mode(motg->v3p3,
152 153
				USB_PHY_3P3_HPM_LOAD);
		if (ret < 0) {
154
			pr_err("Could not set HPM for v3p3\n");
155
			regulator_set_optimum_mode(motg->v1p8,
156 157 158 159
				USB_PHY_1P8_LPM_LOAD);
			return ret;
		}
	} else {
160
		ret = regulator_set_optimum_mode(motg->v1p8,
161 162
				USB_PHY_1P8_LPM_LOAD);
		if (ret < 0)
163
			pr_err("Could not set LPM for v1p8\n");
164
		ret = regulator_set_optimum_mode(motg->v3p3,
165 166
				USB_PHY_3P3_LPM_LOAD);
		if (ret < 0)
167
			pr_err("Could not set LPM for v3p3\n");
168 169 170 171 172 173
	}

	pr_debug("reg (%s)\n", on ? "HPM" : "LPM");
	return ret < 0 ? ret : 0;
}

174
static int ulpi_read(struct usb_phy *phy, u32 reg)
175
{
176
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
	int cnt = 0;

	/* initiate read operation */
	writel(ULPI_RUN | ULPI_READ | ULPI_ADDR(reg),
	       USB_ULPI_VIEWPORT);

	/* wait for completion */
	while (cnt < ULPI_IO_TIMEOUT_USEC) {
		if (!(readl(USB_ULPI_VIEWPORT) & ULPI_RUN))
			break;
		udelay(1);
		cnt++;
	}

	if (cnt >= ULPI_IO_TIMEOUT_USEC) {
192
		dev_err(phy->dev, "ulpi_read: timeout %08x\n",
193 194 195 196 197 198
			readl(USB_ULPI_VIEWPORT));
		return -ETIMEDOUT;
	}
	return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT));
}

199
static int ulpi_write(struct usb_phy *phy, u32 val, u32 reg)
200
{
201
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
	int cnt = 0;

	/* initiate write operation */
	writel(ULPI_RUN | ULPI_WRITE |
	       ULPI_ADDR(reg) | ULPI_DATA(val),
	       USB_ULPI_VIEWPORT);

	/* wait for completion */
	while (cnt < ULPI_IO_TIMEOUT_USEC) {
		if (!(readl(USB_ULPI_VIEWPORT) & ULPI_RUN))
			break;
		udelay(1);
		cnt++;
	}

	if (cnt >= ULPI_IO_TIMEOUT_USEC) {
218
		dev_err(phy->dev, "ulpi_write: timeout\n");
219 220 221 222 223
		return -ETIMEDOUT;
	}
	return 0;
}

224
static struct usb_phy_io_ops msm_otg_io_ops = {
225 226 227 228 229 230 231
	.read = ulpi_read,
	.write = ulpi_write,
};

static void ulpi_init(struct msm_otg *motg)
{
	struct msm_otg_platform_data *pdata = motg->pdata;
232 233
	int *seq = pdata->phy_init_seq, idx;
	u32 addr = ULPI_EXT_VENDOR_SPECIFIC;
234

235 236 237
	for (idx = 0; idx < pdata->phy_init_sz; idx++) {
		if (seq[idx] == -1)
			continue;
238

239
		dev_vdbg(motg->phy.dev, "ulpi: write 0x%02x to 0x%02x\n",
240 241
				seq[idx], addr + idx);
		ulpi_write(&motg->phy, seq[idx], addr + idx);
242 243 244
	}
}

245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
static int msm_phy_notify_disconnect(struct usb_phy *phy,
				   enum usb_device_speed speed)
{
	int val;

	/*
	 * Put the transceiver in non-driving mode. Otherwise host
	 * may not detect soft-disconnection.
	 */
	val = ulpi_read(phy, ULPI_FUNC_CTRL);
	val &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
	val |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
	ulpi_write(phy, val, ULPI_FUNC_CTRL);

	return 0;
}

262 263
static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert)
{
264
	int ret;
265

266 267 268 269 270 271
	if (motg->pdata->link_clk_reset)
		ret = motg->pdata->link_clk_reset(motg->clk, assert);
	else if (assert)
		ret = reset_control_assert(motg->link_rst);
	else
		ret = reset_control_deassert(motg->link_rst);
272 273 274 275

	if (ret)
		dev_err(motg->phy.dev, "usb link clk reset %s failed\n",
			assert ? "assert" : "deassert");
276 277 278 279 280 281

	return ret;
}

static int msm_otg_phy_clk_reset(struct msm_otg *motg)
{
282
	int ret = 0;
283

284
	if (motg->pdata->phy_clk_reset && motg->phy_reset_clk)
285
		ret = motg->pdata->phy_clk_reset(motg->phy_reset_clk);
286
	else if (motg->phy_rst)
287
		ret = reset_control_reset(motg->phy_rst);
288

289
	if (ret)
290 291
		dev_err(motg->phy.dev, "usb phy clk reset failed\n");

292 293 294
	return ret;
}

295
static int msm_link_reset(struct msm_otg *motg)
296 297 298 299 300 301 302 303
{
	u32 val;
	int ret;

	ret = msm_otg_link_clk_reset(motg, 1);
	if (ret)
		return ret;

304 305
	/* wait for 1ms delay as suggested in HPG. */
	usleep_range(1000, 1200);
306

307
	ret = msm_otg_link_clk_reset(motg, 0);
308 309 310
	if (ret)
		return ret;

311 312 313
	if (motg->phy_number)
		writel(readl(USB_PHY_CTRL2) | BIT(16), USB_PHY_CTRL2);

314
	/* put transceiver in serial mode as part of reset */
315
	val = readl(USB_PORTSC) & ~PORTSC_PTS_MASK;
316
	writel(val | PORTSC_PTS_SERIAL, USB_PORTSC);
317

318 319 320
	return 0;
}

321
static int msm_otg_reset(struct usb_phy *phy)
322
{
323
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
324 325 326 327 328 329 330 331 332 333 334 335
	int cnt = 0;

	writel(USBCMD_RESET, USB_USBCMD);
	while (cnt < LINK_RESET_TIMEOUT_USEC) {
		if (!(readl(USB_USBCMD) & USBCMD_RESET))
			break;
		udelay(1);
		cnt++;
	}
	if (cnt >= LINK_RESET_TIMEOUT_USEC)
		return -ETIMEDOUT;

336 337 338
	/* select ULPI phy and clear other status/control bits in PORTSC */
	writel(PORTSC_PTS_ULPI, USB_PORTSC);

339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
	writel(0x0, USB_AHBBURST);
	writel(0x08, USB_AHBMODE);

	if (motg->phy_number)
		writel(readl(USB_PHY_CTRL2) | BIT(16), USB_PHY_CTRL2);
	return 0;
}

static void msm_phy_reset(struct msm_otg *motg)
{
	void __iomem *addr;

	if (motg->pdata->phy_type != SNPS_28NM_INTEGRATED_PHY) {
		msm_otg_phy_clk_reset(motg);
		return;
	}

	addr = USB_PHY_CTRL;
	if (motg->phy_number)
		addr = USB_PHY_CTRL2;

	/* Assert USB PHY_POR */
	writel(readl(addr) | PHY_POR_ASSERT, addr);

	/*
	 * wait for minimum 10 microseconds as suggested in HPG.
	 * Use a slightly larger value since the exact value didn't
	 * work 100% of the time.
	 */
	udelay(12);

	/* Deassert USB PHY_POR */
	writel(readl(addr) & ~PHY_POR_ASSERT, addr);
}

static int msm_usb_reset(struct usb_phy *phy)
{
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
	int ret;

	if (!IS_ERR(motg->core_clk))
		clk_prepare_enable(motg->core_clk);

	ret = msm_link_reset(motg);
	if (ret) {
		dev_err(phy->dev, "phy_reset failed\n");
		return ret;
	}

	ret = msm_otg_reset(&motg->phy);
	if (ret) {
		dev_err(phy->dev, "link reset failed\n");
		return ret;
	}
393 394 395

	msleep(100);

396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
	/* Reset USB PHY after performing USB Link RESET */
	msm_phy_reset(motg);

	if (!IS_ERR(motg->core_clk))
		clk_disable_unprepare(motg->core_clk);

	return 0;
}

static int msm_phy_init(struct usb_phy *phy)
{
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
	struct msm_otg_platform_data *pdata = motg->pdata;
	u32 val, ulpi_val = 0;

	/* Program USB PHY Override registers. */
	ulpi_init(motg);

	/*
	 * It is recommended in HPG to reset USB PHY after programming
	 * USB PHY Override registers.
	 */
	msm_phy_reset(motg);
419 420 421

	if (pdata->otg_control == OTG_PHY_CONTROL) {
		val = readl(USB_OTGSC);
422
		if (pdata->mode == USB_DR_MODE_OTG) {
423 424
			ulpi_val = ULPI_INT_IDGRD | ULPI_INT_SESS_VALID;
			val |= OTGSC_IDIE | OTGSC_BSVIE;
425
		} else if (pdata->mode == USB_DR_MODE_PERIPHERAL) {
426 427 428 429
			ulpi_val = ULPI_INT_SESS_VALID;
			val |= OTGSC_BSVIE;
		}
		writel(val, USB_OTGSC);
430 431
		ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_RISE);
		ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_FALL);
432 433
	}

434 435 436
	if (motg->phy_number)
		writel(readl(USB_PHY_CTRL2) | BIT(16), USB_PHY_CTRL2);

437 438 439
	return 0;
}

440
#define PHY_SUSPEND_TIMEOUT_USEC	(500 * 1000)
441 442
#define PHY_RESUME_TIMEOUT_USEC	(100 * 1000)

443 444
#ifdef CONFIG_PM

445
static int msm_hsusb_config_vddcx(struct msm_otg *motg, int high)
446
{
447
	int max_vol = motg->vdd_levels[VDD_LEVEL_MAX];
448 449 450 451
	int min_vol;
	int ret;

	if (high)
452
		min_vol = motg->vdd_levels[VDD_LEVEL_MIN];
453
	else
454
		min_vol = motg->vdd_levels[VDD_LEVEL_NONE];
455

456
	ret = regulator_set_voltage(motg->vddcx, min_vol, max_vol);
457
	if (ret) {
458
		pr_err("Cannot set vddcx voltage\n");
459 460 461 462 463 464 465 466
		return ret;
	}

	pr_debug("%s: min_vol:%d max_vol:%d\n", __func__, min_vol, max_vol);

	return ret;
}

467 468
static int msm_otg_suspend(struct msm_otg *motg)
{
469 470
	struct usb_phy *phy = &motg->phy;
	struct usb_bus *bus = phy->otg->host;
471
	struct msm_otg_platform_data *pdata = motg->pdata;
472
	void __iomem *addr;
473 474 475 476 477 478 479
	int cnt = 0;

	if (atomic_read(&motg->in_lpm))
		return 0;

	disable_irq(motg->irq);
	/*
480 481
	 * Chipidea 45-nm PHY suspend sequence:
	 *
482 483 484 485
	 * Interrupt Latch Register auto-clear feature is not present
	 * in all PHY versions. Latch register is clear on read type.
	 * Clear latch register to avoid spurious wakeup from
	 * low power mode (LPM).
486
	 *
487 488 489 490
	 * PHY comparators are disabled when PHY enters into low power
	 * mode (LPM). Keep PHY comparators ON in LPM only when we expect
	 * VBUS/Id notifications from USB PHY. Otherwise turn off USB
	 * PHY comparators. This save significant amount of power.
491
	 *
492 493 494
	 * PLL is not turned off when PHY enters into low power mode (LPM).
	 * Disable PLL for maximum power savings.
	 */
495 496

	if (motg->pdata->phy_type == CI_45NM_INTEGRATED_PHY) {
497
		ulpi_read(phy, 0x14);
498
		if (pdata->otg_control == OTG_PHY_CONTROL)
499 500
			ulpi_write(phy, 0x01, 0x30);
		ulpi_write(phy, 0x08, 0x09);
501
	}
502 503 504 505 506 507 508 509 510 511 512 513 514 515 516

	/*
	 * PHY may take some time or even fail to enter into low power
	 * mode (LPM). Hence poll for 500 msec and reset the PHY and link
	 * in failure case.
	 */
	writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC);
	while (cnt < PHY_SUSPEND_TIMEOUT_USEC) {
		if (readl(USB_PORTSC) & PORTSC_PHCD)
			break;
		udelay(1);
		cnt++;
	}

	if (cnt >= PHY_SUSPEND_TIMEOUT_USEC) {
517 518
		dev_err(phy->dev, "Unable to suspend PHY\n");
		msm_otg_reset(phy);
519 520 521 522 523 524 525 526 527 528 529 530 531
		enable_irq(motg->irq);
		return -ETIMEDOUT;
	}

	/*
	 * PHY has capability to generate interrupt asynchronously in low
	 * power mode (LPM). This interrupt is level triggered. So USB IRQ
	 * line must be disabled till async interrupt enable bit is cleared
	 * in USBCMD register. Assert STP (ULPI interface STOP signal) to
	 * block data communication from PHY.
	 */
	writel(readl(USB_USBCMD) | ASYNC_INTR_CTRL | ULPI_STP_CTRL, USB_USBCMD);

532 533 534 535
	addr = USB_PHY_CTRL;
	if (motg->phy_number)
		addr = USB_PHY_CTRL2;

536 537
	if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY &&
			motg->pdata->otg_control == OTG_PMIC_CONTROL)
538
		writel(readl(addr) | PHY_RETEN, addr);
539

540 541
	clk_disable_unprepare(motg->pclk);
	clk_disable_unprepare(motg->clk);
542
	if (!IS_ERR(motg->core_clk))
543
		clk_disable_unprepare(motg->core_clk);
544

545 546
	if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY &&
			motg->pdata->otg_control == OTG_PMIC_CONTROL) {
547 548
		msm_hsusb_ldo_set_mode(motg, 0);
		msm_hsusb_config_vddcx(motg, 0);
549 550
	}

551
	if (device_may_wakeup(phy->dev))
552 553 554 555 556 557 558
		enable_irq_wake(motg->irq);
	if (bus)
		clear_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags);

	atomic_set(&motg->in_lpm, 1);
	enable_irq(motg->irq);

559
	dev_info(phy->dev, "USB in low power mode\n");
560 561 562 563 564 565

	return 0;
}

static int msm_otg_resume(struct msm_otg *motg)
{
566 567
	struct usb_phy *phy = &motg->phy;
	struct usb_bus *bus = phy->otg->host;
568
	void __iomem *addr;
569 570 571 572 573 574
	int cnt = 0;
	unsigned temp;

	if (!atomic_read(&motg->in_lpm))
		return 0;

575 576
	clk_prepare_enable(motg->pclk);
	clk_prepare_enable(motg->clk);
577
	if (!IS_ERR(motg->core_clk))
578
		clk_prepare_enable(motg->core_clk);
579

580 581
	if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY &&
			motg->pdata->otg_control == OTG_PMIC_CONTROL) {
582 583 584 585 586

		addr = USB_PHY_CTRL;
		if (motg->phy_number)
			addr = USB_PHY_CTRL2;

587 588
		msm_hsusb_ldo_set_mode(motg, 1);
		msm_hsusb_config_vddcx(motg, 1);
589
		writel(readl(addr) & ~PHY_RETEN, addr);
590 591
	}

592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
	temp = readl(USB_USBCMD);
	temp &= ~ASYNC_INTR_CTRL;
	temp &= ~ULPI_STP_CTRL;
	writel(temp, USB_USBCMD);

	/*
	 * PHY comes out of low power mode (LPM) in case of wakeup
	 * from asynchronous interrupt.
	 */
	if (!(readl(USB_PORTSC) & PORTSC_PHCD))
		goto skip_phy_resume;

	writel(readl(USB_PORTSC) & ~PORTSC_PHCD, USB_PORTSC);
	while (cnt < PHY_RESUME_TIMEOUT_USEC) {
		if (!(readl(USB_PORTSC) & PORTSC_PHCD))
			break;
		udelay(1);
		cnt++;
	}

	if (cnt >= PHY_RESUME_TIMEOUT_USEC) {
		/*
		 * This is a fatal error. Reset the link and
		 * PHY. USB state can not be restored. Re-insertion
		 * of USB cable is the only way to get USB working.
		 */
618
		dev_err(phy->dev, "Unable to resume USB. Re-plugin the cable\n");
619
		msm_otg_reset(phy);
620 621 622
	}

skip_phy_resume:
623
	if (device_may_wakeup(phy->dev))
624 625 626 627
		disable_irq_wake(motg->irq);
	if (bus)
		set_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags);

628 629
	atomic_set(&motg->in_lpm, 0);

630 631
	if (motg->async_int) {
		motg->async_int = 0;
632
		pm_runtime_put(phy->dev);
633 634 635
		enable_irq(motg->irq);
	}

636
	dev_info(phy->dev, "USB exited from low power mode\n");
637 638 639

	return 0;
}
640
#endif
641

642 643 644 645 646 647
static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA)
{
	if (motg->cur_power == mA)
		return;

	/* TODO: Notify PMIC about available current */
648
	dev_info(motg->phy.dev, "Avail curr from USB = %u\n", mA);
649 650 651
	motg->cur_power = mA;
}

652
static int msm_otg_set_power(struct usb_phy *phy, unsigned mA)
653
{
654
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
655 656 657 658 659 660 661 662 663 664 665 666 667 668

	/*
	 * Gadget driver uses set_power method to notify about the
	 * available current based on suspend/configured states.
	 *
	 * IDEV_CHG can be drawn irrespective of suspend/un-configured
	 * states when CDP/ACA is connected.
	 */
	if (motg->chg_type == USB_SDP_CHARGER)
		msm_otg_notify_charger(motg, mA);

	return 0;
}

669
static void msm_otg_start_host(struct usb_phy *phy, int on)
670
{
671
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
672 673 674
	struct msm_otg_platform_data *pdata = motg->pdata;
	struct usb_hcd *hcd;

675
	if (!phy->otg->host)
676 677
		return;

678
	hcd = bus_to_hcd(phy->otg->host);
679 680

	if (on) {
681
		dev_dbg(phy->dev, "host on\n");
682 683 684 685 686 687 688 689 690 691 692 693

		if (pdata->vbus_power)
			pdata->vbus_power(1);
		/*
		 * Some boards have a switch cotrolled by gpio
		 * to enable/disable internal HUB. Enable internal
		 * HUB before kicking the host.
		 */
		if (pdata->setup_gpio)
			pdata->setup_gpio(OTG_STATE_A_HOST);
#ifdef CONFIG_USB
		usb_add_hcd(hcd, hcd->irq, IRQF_SHARED);
694
		device_wakeup_enable(hcd->self.controller);
695 696
#endif
	} else {
697
		dev_dbg(phy->dev, "host off\n");
698 699 700 701 702 703 704 705 706 707 708

#ifdef CONFIG_USB
		usb_remove_hcd(hcd);
#endif
		if (pdata->setup_gpio)
			pdata->setup_gpio(OTG_STATE_UNDEFINED);
		if (pdata->vbus_power)
			pdata->vbus_power(0);
	}
}

709
static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
710
{
711
	struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
712 713 714 715 716 717
	struct usb_hcd *hcd;

	/*
	 * Fail host registration if this board can support
	 * only peripheral configuration.
	 */
718
	if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL) {
719
		dev_info(otg->phy->dev, "Host mode is not supported\n");
720 721 722 723
		return -ENODEV;
	}

	if (!host) {
724 725 726
		if (otg->phy->state == OTG_STATE_A_HOST) {
			pm_runtime_get_sync(otg->phy->dev);
			msm_otg_start_host(otg->phy, 0);
727
			otg->host = NULL;
728
			otg->phy->state = OTG_STATE_UNDEFINED;
729 730 731 732 733 734 735 736 737 738 739 740
			schedule_work(&motg->sm_work);
		} else {
			otg->host = NULL;
		}

		return 0;
	}

	hcd = bus_to_hcd(host);
	hcd->power_budget = motg->pdata->power_budget;

	otg->host = host;
741
	dev_dbg(otg->phy->dev, "host driver registered w/ tranceiver\n");
742 743 744 745 746

	/*
	 * Kick the state machine work, if peripheral is not supported
	 * or peripheral is already registered with us.
	 */
747
	if (motg->pdata->mode == USB_DR_MODE_HOST || otg->gadget) {
748
		pm_runtime_get_sync(otg->phy->dev);
749
		schedule_work(&motg->sm_work);
750
	}
751 752 753 754

	return 0;
}

755
static void msm_otg_start_peripheral(struct usb_phy *phy, int on)
756
{
757
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
758 759
	struct msm_otg_platform_data *pdata = motg->pdata;

760
	if (!phy->otg->gadget)
761 762 763
		return;

	if (on) {
764
		dev_dbg(phy->dev, "gadget on\n");
765 766 767 768 769 770 771
		/*
		 * Some boards have a switch cotrolled by gpio
		 * to enable/disable internal HUB. Disable internal
		 * HUB before kicking the gadget.
		 */
		if (pdata->setup_gpio)
			pdata->setup_gpio(OTG_STATE_B_PERIPHERAL);
772
		usb_gadget_vbus_connect(phy->otg->gadget);
773
	} else {
774 775
		dev_dbg(phy->dev, "gadget off\n");
		usb_gadget_vbus_disconnect(phy->otg->gadget);
776 777 778 779 780 781
		if (pdata->setup_gpio)
			pdata->setup_gpio(OTG_STATE_UNDEFINED);
	}

}

782 783
static int msm_otg_set_peripheral(struct usb_otg *otg,
					struct usb_gadget *gadget)
784
{
785
	struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
786 787 788 789 790

	/*
	 * Fail peripheral registration if this board can support
	 * only host configuration.
	 */
791
	if (motg->pdata->mode == USB_DR_MODE_HOST) {
792
		dev_info(otg->phy->dev, "Peripheral mode is not supported\n");
793 794 795 796
		return -ENODEV;
	}

	if (!gadget) {
797 798 799
		if (otg->phy->state == OTG_STATE_B_PERIPHERAL) {
			pm_runtime_get_sync(otg->phy->dev);
			msm_otg_start_peripheral(otg->phy, 0);
800
			otg->gadget = NULL;
801
			otg->phy->state = OTG_STATE_UNDEFINED;
802 803 804 805 806 807 808 809
			schedule_work(&motg->sm_work);
		} else {
			otg->gadget = NULL;
		}

		return 0;
	}
	otg->gadget = gadget;
810
	dev_dbg(otg->phy->dev, "peripheral driver registered w/ tranceiver\n");
811 812 813 814 815

	/*
	 * Kick the state machine work, if host is not supported
	 * or host is already registered with us.
	 */
816
	if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL || otg->host) {
817
		pm_runtime_get_sync(otg->phy->dev);
818
		schedule_work(&motg->sm_work);
819
	}
820 821 822 823

	return 0;
}

824 825
static bool msm_chg_check_secondary_det(struct msm_otg *motg)
{
826
	struct usb_phy *phy = &motg->phy;
827 828 829 830 831
	u32 chg_det;
	bool ret = false;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
832
		chg_det = ulpi_read(phy, 0x34);
833 834 835
		ret = chg_det & (1 << 4);
		break;
	case SNPS_28NM_INTEGRATED_PHY:
836
		chg_det = ulpi_read(phy, 0x87);
837 838 839 840 841 842 843 844 845 846
		ret = chg_det & 1;
		break;
	default:
		break;
	}
	return ret;
}

static void msm_chg_enable_secondary_det(struct msm_otg *motg)
{
847
	struct usb_phy *phy = &motg->phy;
848 849 850 851
	u32 chg_det;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
852
		chg_det = ulpi_read(phy, 0x34);
853 854
		/* Turn off charger block */
		chg_det |= ~(1 << 1);
855
		ulpi_write(phy, chg_det, 0x34);
856 857 858
		udelay(20);
		/* control chg block via ULPI */
		chg_det &= ~(1 << 3);
859
		ulpi_write(phy, chg_det, 0x34);
860 861
		/* put it in host mode for enabling D- source */
		chg_det &= ~(1 << 2);
862
		ulpi_write(phy, chg_det, 0x34);
863 864
		/* Turn on chg detect block */
		chg_det &= ~(1 << 1);
865
		ulpi_write(phy, chg_det, 0x34);
866 867 868
		udelay(20);
		/* enable chg detection */
		chg_det &= ~(1 << 0);
869
		ulpi_write(phy, chg_det, 0x34);
870 871 872 873 874 875
		break;
	case SNPS_28NM_INTEGRATED_PHY:
		/*
		 * Configure DM as current source, DP as current sink
		 * and enable battery charging comparators.
		 */
876 877 878
		ulpi_write(phy, 0x8, 0x85);
		ulpi_write(phy, 0x2, 0x85);
		ulpi_write(phy, 0x1, 0x85);
879 880 881 882 883 884 885 886
		break;
	default:
		break;
	}
}

static bool msm_chg_check_primary_det(struct msm_otg *motg)
{
887
	struct usb_phy *phy = &motg->phy;
888 889 890 891 892
	u32 chg_det;
	bool ret = false;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
893
		chg_det = ulpi_read(phy, 0x34);
894 895 896
		ret = chg_det & (1 << 4);
		break;
	case SNPS_28NM_INTEGRATED_PHY:
897
		chg_det = ulpi_read(phy, 0x87);
898 899 900 901 902 903 904 905 906 907
		ret = chg_det & 1;
		break;
	default:
		break;
	}
	return ret;
}

static void msm_chg_enable_primary_det(struct msm_otg *motg)
{
908
	struct usb_phy *phy = &motg->phy;
909 910 911 912
	u32 chg_det;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
913
		chg_det = ulpi_read(phy, 0x34);
914 915
		/* enable chg detection */
		chg_det &= ~(1 << 0);
916
		ulpi_write(phy, chg_det, 0x34);
917 918 919 920 921 922
		break;
	case SNPS_28NM_INTEGRATED_PHY:
		/*
		 * Configure DP as current source, DM as current sink
		 * and enable battery charging comparators.
		 */
923 924
		ulpi_write(phy, 0x2, 0x85);
		ulpi_write(phy, 0x1, 0x85);
925 926 927 928 929 930 931 932
		break;
	default:
		break;
	}
}

static bool msm_chg_check_dcd(struct msm_otg *motg)
{
933
	struct usb_phy *phy = &motg->phy;
934 935 936 937 938
	u32 line_state;
	bool ret = false;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
939
		line_state = ulpi_read(phy, 0x15);
940 941 942
		ret = !(line_state & 1);
		break;
	case SNPS_28NM_INTEGRATED_PHY:
943
		line_state = ulpi_read(phy, 0x87);
944 945 946 947 948 949 950 951 952 953
		ret = line_state & 2;
		break;
	default:
		break;
	}
	return ret;
}

static void msm_chg_disable_dcd(struct msm_otg *motg)
{
954
	struct usb_phy *phy = &motg->phy;
955 956 957 958
	u32 chg_det;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
959
		chg_det = ulpi_read(phy, 0x34);
960
		chg_det &= ~(1 << 5);
961
		ulpi_write(phy, chg_det, 0x34);
962 963
		break;
	case SNPS_28NM_INTEGRATED_PHY:
964
		ulpi_write(phy, 0x10, 0x86);
965 966 967 968 969 970 971 972
		break;
	default:
		break;
	}
}

static void msm_chg_enable_dcd(struct msm_otg *motg)
{
973
	struct usb_phy *phy = &motg->phy;
974 975 976 977
	u32 chg_det;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
978
		chg_det = ulpi_read(phy, 0x34);
979 980
		/* Turn on D+ current source */
		chg_det |= (1 << 5);
981
		ulpi_write(phy, chg_det, 0x34);
982 983 984
		break;
	case SNPS_28NM_INTEGRATED_PHY:
		/* Data contact detection enable */
985
		ulpi_write(phy, 0x10, 0x85);
986 987 988 989 990 991 992 993
		break;
	default:
		break;
	}
}

static void msm_chg_block_on(struct msm_otg *motg)
{
994
	struct usb_phy *phy = &motg->phy;
995 996 997
	u32 func_ctrl, chg_det;

	/* put the controller in non-driving mode */
998
	func_ctrl = ulpi_read(phy, ULPI_FUNC_CTRL);
999 1000
	func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
	func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
1001
	ulpi_write(phy, func_ctrl, ULPI_FUNC_CTRL);
1002 1003 1004

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
1005
		chg_det = ulpi_read(phy, 0x34);
1006 1007
		/* control chg block via ULPI */
		chg_det &= ~(1 << 3);
1008
		ulpi_write(phy, chg_det, 0x34);
1009 1010
		/* Turn on chg detect block */
		chg_det &= ~(1 << 1);
1011
		ulpi_write(phy, chg_det, 0x34);
1012 1013 1014 1015
		udelay(20);
		break;
	case SNPS_28NM_INTEGRATED_PHY:
		/* Clear charger detecting control bits */
1016
		ulpi_write(phy, 0x3F, 0x86);
1017
		/* Clear alt interrupt latch and enable bits */
1018 1019
		ulpi_write(phy, 0x1F, 0x92);
		ulpi_write(phy, 0x1F, 0x95);
1020 1021 1022 1023 1024 1025 1026 1027 1028
		udelay(100);
		break;
	default:
		break;
	}
}

static void msm_chg_block_off(struct msm_otg *motg)
{
1029
	struct usb_phy *phy = &motg->phy;
1030 1031 1032 1033
	u32 func_ctrl, chg_det;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
1034
		chg_det = ulpi_read(phy, 0x34);
1035 1036
		/* Turn off charger block */
		chg_det |= ~(1 << 1);
1037
		ulpi_write(phy, chg_det, 0x34);
1038 1039 1040
		break;
	case SNPS_28NM_INTEGRATED_PHY:
		/* Clear charger detecting control bits */
1041
		ulpi_write(phy, 0x3F, 0x86);
1042
		/* Clear alt interrupt latch and enable bits */
1043 1044
		ulpi_write(phy, 0x1F, 0x92);
		ulpi_write(phy, 0x1F, 0x95);
1045 1046 1047 1048 1049 1050
		break;
	default:
		break;
	}

	/* put the controller in normal mode */
1051
	func_ctrl = ulpi_read(phy, ULPI_FUNC_CTRL);
1052 1053
	func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
	func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NORMAL;
1054
	ulpi_write(phy, func_ctrl, ULPI_FUNC_CTRL);
1055 1056 1057 1058 1059 1060 1061 1062 1063
}

#define MSM_CHG_DCD_POLL_TIME		(100 * HZ/1000) /* 100 msec */
#define MSM_CHG_DCD_MAX_RETRIES		6 /* Tdcd_tmout = 6 * 100 msec */
#define MSM_CHG_PRIMARY_DET_TIME	(40 * HZ/1000) /* TVDPSRC_ON */
#define MSM_CHG_SECONDARY_DET_TIME	(40 * HZ/1000) /* TVDMSRC_ON */
static void msm_chg_detect_work(struct work_struct *w)
{
	struct msm_otg *motg = container_of(w, struct msm_otg, chg_work.work);
1064
	struct usb_phy *phy = &motg->phy;
1065 1066 1067
	bool is_dcd, tmout, vout;
	unsigned long delay;

1068
	dev_dbg(phy->dev, "chg detection work\n");
1069 1070
	switch (motg->chg_state) {
	case USB_CHG_STATE_UNDEFINED:
1071
		pm_runtime_get_sync(phy->dev);
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
		msm_chg_block_on(motg);
		msm_chg_enable_dcd(motg);
		motg->chg_state = USB_CHG_STATE_WAIT_FOR_DCD;
		motg->dcd_retries = 0;
		delay = MSM_CHG_DCD_POLL_TIME;
		break;
	case USB_CHG_STATE_WAIT_FOR_DCD:
		is_dcd = msm_chg_check_dcd(motg);
		tmout = ++motg->dcd_retries == MSM_CHG_DCD_MAX_RETRIES;
		if (is_dcd || tmout) {
			msm_chg_disable_dcd(motg);
			msm_chg_enable_primary_det(motg);
			delay = MSM_CHG_PRIMARY_DET_TIME;
			motg->chg_state = USB_CHG_STATE_DCD_DONE;
		} else {
			delay = MSM_CHG_DCD_POLL_TIME;
		}
		break;
	case USB_CHG_STATE_DCD_DONE:
		vout = msm_chg_check_primary_det(motg);
		if (vout) {
			msm_chg_enable_secondary_det(motg);
			delay = MSM_CHG_SECONDARY_DET_TIME;
			motg->chg_state = USB_CHG_STATE_PRIMARY_DONE;
		} else {
			motg->chg_type = USB_SDP_CHARGER;
			motg->chg_state = USB_CHG_STATE_DETECTED;
			delay = 0;
		}
		break;
	case USB_CHG_STATE_PRIMARY_DONE:
		vout = msm_chg_check_secondary_det(motg);
		if (vout)
			motg->chg_type = USB_DCP_CHARGER;
		else
			motg->chg_type = USB_CDP_CHARGER;
		motg->chg_state = USB_CHG_STATE_SECONDARY_DONE;
		/* fall through */
	case USB_CHG_STATE_SECONDARY_DONE:
		motg->chg_state = USB_CHG_STATE_DETECTED;
	case USB_CHG_STATE_DETECTED:
		msm_chg_block_off(motg);
1114
		dev_dbg(phy->dev, "charger = %d\n", motg->chg_type);
1115 1116 1117 1118 1119 1120 1121 1122 1123
		schedule_work(&motg->sm_work);
		return;
	default:
		return;
	}

	schedule_delayed_work(&motg->chg_work, delay);
}

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
/*
 * We support OTG, Peripheral only and Host only configurations. In case
 * of OTG, mode switch (host-->peripheral/peripheral-->host) can happen
 * via Id pin status or user request (debugfs). Id/BSV interrupts are not
 * enabled when switch is controlled by user and default mode is supplied
 * by board file, which can be changed by userspace later.
 */
static void msm_otg_init_sm(struct msm_otg *motg)
{
	struct msm_otg_platform_data *pdata = motg->pdata;
	u32 otgsc = readl(USB_OTGSC);

	switch (pdata->mode) {
1137
	case USB_DR_MODE_OTG:
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152
		if (pdata->otg_control == OTG_PHY_CONTROL) {
			if (otgsc & OTGSC_ID)
				set_bit(ID, &motg->inputs);
			else
				clear_bit(ID, &motg->inputs);

			if (otgsc & OTGSC_BSV)
				set_bit(B_SESS_VLD, &motg->inputs);
			else
				clear_bit(B_SESS_VLD, &motg->inputs);
		} else if (pdata->otg_control == OTG_USER_CONTROL) {
				set_bit(ID, &motg->inputs);
				clear_bit(B_SESS_VLD, &motg->inputs);
		}
		break;
1153
	case USB_DR_MODE_HOST:
1154 1155
		clear_bit(ID, &motg->inputs);
		break;
1156
	case USB_DR_MODE_PERIPHERAL:
1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
		set_bit(ID, &motg->inputs);
		if (otgsc & OTGSC_BSV)
			set_bit(B_SESS_VLD, &motg->inputs);
		else
			clear_bit(B_SESS_VLD, &motg->inputs);
		break;
	default:
		break;
	}
}

static void msm_otg_sm_work(struct work_struct *w)
{
	struct msm_otg *motg = container_of(w, struct msm_otg, sm_work);
1171
	struct usb_otg *otg = motg->phy.otg;
1172

1173
	switch (otg->phy->state) {
1174
	case OTG_STATE_UNDEFINED:
1175 1176
		dev_dbg(otg->phy->dev, "OTG_STATE_UNDEFINED state\n");
		msm_otg_reset(otg->phy);
1177
		msm_otg_init_sm(motg);
1178
		otg->phy->state = OTG_STATE_B_IDLE;
1179 1180
		/* FALL THROUGH */
	case OTG_STATE_B_IDLE:
1181
		dev_dbg(otg->phy->dev, "OTG_STATE_B_IDLE state\n");
1182 1183 1184
		if (!test_bit(ID, &motg->inputs) && otg->host) {
			/* disable BSV bit */
			writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
1185 1186
			msm_otg_start_host(otg->phy, 1);
			otg->phy->state = OTG_STATE_A_HOST;
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
		} else if (test_bit(B_SESS_VLD, &motg->inputs)) {
			switch (motg->chg_state) {
			case USB_CHG_STATE_UNDEFINED:
				msm_chg_detect_work(&motg->chg_work.work);
				break;
			case USB_CHG_STATE_DETECTED:
				switch (motg->chg_type) {
				case USB_DCP_CHARGER:
					msm_otg_notify_charger(motg,
							IDEV_CHG_MAX);
					break;
				case USB_CDP_CHARGER:
					msm_otg_notify_charger(motg,
							IDEV_CHG_MAX);
1201 1202 1203
					msm_otg_start_peripheral(otg->phy, 1);
					otg->phy->state
						= OTG_STATE_B_PERIPHERAL;
1204 1205 1206
					break;
				case USB_SDP_CHARGER:
					msm_otg_notify_charger(motg, IUNIT);
1207 1208 1209
					msm_otg_start_peripheral(otg->phy, 1);
					otg->phy->state
						= OTG_STATE_B_PERIPHERAL;
1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224
					break;
				default:
					break;
				}
				break;
			default:
				break;
			}
		} else {
			/*
			 * If charger detection work is pending, decrement
			 * the pm usage counter to balance with the one that
			 * is incremented in charger detection work.
			 */
			if (cancel_delayed_work_sync(&motg->chg_work)) {
1225 1226
				pm_runtime_put_sync(otg->phy->dev);
				msm_otg_reset(otg->phy);
1227 1228 1229 1230
			}
			msm_otg_notify_charger(motg, 0);
			motg->chg_state = USB_CHG_STATE_UNDEFINED;
			motg->chg_type = USB_INVALID_CHARGER;
1231
		}
1232 1233 1234

		if (otg->phy->state == OTG_STATE_B_IDLE)
			pm_runtime_put_sync(otg->phy->dev);
1235 1236
		break;
	case OTG_STATE_B_PERIPHERAL:
1237
		dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
1238 1239
		if (!test_bit(B_SESS_VLD, &motg->inputs) ||
				!test_bit(ID, &motg->inputs)) {
1240
			msm_otg_notify_charger(motg, 0);
1241
			msm_otg_start_peripheral(otg->phy, 0);
1242 1243
			motg->chg_state = USB_CHG_STATE_UNDEFINED;
			motg->chg_type = USB_INVALID_CHARGER;
1244 1245
			otg->phy->state = OTG_STATE_B_IDLE;
			msm_otg_reset(otg->phy);
1246 1247 1248 1249
			schedule_work(w);
		}
		break;
	case OTG_STATE_A_HOST:
1250
		dev_dbg(otg->phy->dev, "OTG_STATE_A_HOST state\n");
1251
		if (test_bit(ID, &motg->inputs)) {
1252 1253 1254
			msm_otg_start_host(otg->phy, 0);
			otg->phy->state = OTG_STATE_B_IDLE;
			msm_otg_reset(otg->phy);
1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265
			schedule_work(w);
		}
		break;
	default:
		break;
	}
}

static irqreturn_t msm_otg_irq(int irq, void *data)
{
	struct msm_otg *motg = data;
1266
	struct usb_phy *phy = &motg->phy;
1267 1268
	u32 otgsc = 0;

1269 1270 1271
	if (atomic_read(&motg->in_lpm)) {
		disable_irq_nosync(irq);
		motg->async_int = 1;
1272
		pm_runtime_get(phy->dev);
1273 1274 1275
		return IRQ_HANDLED;
	}

1276 1277 1278 1279 1280 1281 1282 1283 1284
	otgsc = readl(USB_OTGSC);
	if (!(otgsc & (OTGSC_IDIS | OTGSC_BSVIS)))
		return IRQ_NONE;

	if ((otgsc & OTGSC_IDIS) && (otgsc & OTGSC_IDIE)) {
		if (otgsc & OTGSC_ID)
			set_bit(ID, &motg->inputs);
		else
			clear_bit(ID, &motg->inputs);
1285 1286
		dev_dbg(phy->dev, "ID set/clear\n");
		pm_runtime_get_noresume(phy->dev);
1287 1288 1289 1290 1291
	} else if ((otgsc & OTGSC_BSVIS) && (otgsc & OTGSC_BSVIE)) {
		if (otgsc & OTGSC_BSV)
			set_bit(B_SESS_VLD, &motg->inputs);
		else
			clear_bit(B_SESS_VLD, &motg->inputs);
1292 1293
		dev_dbg(phy->dev, "BSV set/clear\n");
		pm_runtime_get_noresume(phy->dev);
1294 1295 1296 1297 1298 1299 1300 1301 1302 1303
	}

	writel(otgsc, USB_OTGSC);
	schedule_work(&motg->sm_work);
	return IRQ_HANDLED;
}

static int msm_otg_mode_show(struct seq_file *s, void *unused)
{
	struct msm_otg *motg = s->private;
1304
	struct usb_otg *otg = motg->phy.otg;
1305

1306
	switch (otg->phy->state) {
1307
	case OTG_STATE_A_HOST:
1308
		seq_puts(s, "host\n");
1309 1310
		break;
	case OTG_STATE_B_PERIPHERAL:
1311
		seq_puts(s, "peripheral\n");
1312 1313
		break;
	default:
1314
		seq_puts(s, "none\n");
1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328
		break;
	}

	return 0;
}

static int msm_otg_mode_open(struct inode *inode, struct file *file)
{
	return single_open(file, msm_otg_mode_show, inode->i_private);
}

static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
				size_t count, loff_t *ppos)
{
1329 1330
	struct seq_file *s = file->private_data;
	struct msm_otg *motg = s->private;
1331
	char buf[16];
1332
	struct usb_otg *otg = motg->phy.otg;
1333
	int status = count;
1334
	enum usb_dr_mode req_mode;
1335 1336 1337 1338 1339 1340 1341 1342 1343

	memset(buf, 0x00, sizeof(buf));

	if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) {
		status = -EFAULT;
		goto out;
	}

	if (!strncmp(buf, "host", 4)) {
1344
		req_mode = USB_DR_MODE_HOST;
1345
	} else if (!strncmp(buf, "peripheral", 10)) {
1346
		req_mode = USB_DR_MODE_PERIPHERAL;
1347
	} else if (!strncmp(buf, "none", 4)) {
1348
		req_mode = USB_DR_MODE_UNKNOWN;
1349 1350 1351 1352 1353 1354
	} else {
		status = -EINVAL;
		goto out;
	}

	switch (req_mode) {
1355
	case USB_DR_MODE_UNKNOWN:
1356
		switch (otg->phy->state) {
1357 1358 1359 1360 1361 1362 1363 1364 1365
		case OTG_STATE_A_HOST:
		case OTG_STATE_B_PERIPHERAL:
			set_bit(ID, &motg->inputs);
			clear_bit(B_SESS_VLD, &motg->inputs);
			break;
		default:
			goto out;
		}
		break;
1366
	case USB_DR_MODE_PERIPHERAL:
1367
		switch (otg->phy->state) {
1368 1369 1370 1371 1372 1373 1374 1375 1376
		case OTG_STATE_B_IDLE:
		case OTG_STATE_A_HOST:
			set_bit(ID, &motg->inputs);
			set_bit(B_SESS_VLD, &motg->inputs);
			break;
		default:
			goto out;
		}
		break;
1377
	case USB_DR_MODE_HOST:
1378
		switch (otg->phy->state) {
1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
		case OTG_STATE_B_IDLE:
		case OTG_STATE_B_PERIPHERAL:
			clear_bit(ID, &motg->inputs);
			break;
		default:
			goto out;
		}
		break;
	default:
		goto out;
	}

1391
	pm_runtime_get_sync(otg->phy->dev);
1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
	schedule_work(&motg->sm_work);
out:
	return status;
}

const struct file_operations msm_otg_mode_fops = {
	.open = msm_otg_mode_open,
	.read = seq_read,
	.write = msm_otg_mode_write,
	.llseek = seq_lseek,
	.release = single_release,
};

static struct dentry *msm_otg_dbg_root;
static struct dentry *msm_otg_dbg_mode;

static int msm_otg_debugfs_init(struct msm_otg *motg)
{
	msm_otg_dbg_root = debugfs_create_dir("msm_otg", NULL);

	if (!msm_otg_dbg_root || IS_ERR(msm_otg_dbg_root))
		return -ENODEV;

	msm_otg_dbg_mode = debugfs_create_file("mode", S_IRUGO | S_IWUSR,
				msm_otg_dbg_root, motg, &msm_otg_mode_fops);
	if (!msm_otg_dbg_mode) {
		debugfs_remove(msm_otg_dbg_root);
		msm_otg_dbg_root = NULL;
		return -ENODEV;
	}

	return 0;
}

static void msm_otg_debugfs_cleanup(void)
{
	debugfs_remove(msm_otg_dbg_mode);
	debugfs_remove(msm_otg_dbg_root);
}

1432
static const struct of_device_id msm_otg_dt_match[] = {
1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
	{
		.compatible = "qcom,usb-otg-ci",
		.data = (void *) CI_45NM_INTEGRATED_PHY
	},
	{
		.compatible = "qcom,usb-otg-snps",
		.data = (void *) SNPS_28NM_INTEGRATED_PHY
	},
	{ }
};
MODULE_DEVICE_TABLE(of, msm_otg_dt_match);

static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg)
{
	struct msm_otg_platform_data *pdata;
	const struct of_device_id *id;
	struct device_node *node = pdev->dev.of_node;
	struct property *prop;
	int len, ret, words;
1452
	u32 val, tmp[3];
1453 1454 1455 1456 1457 1458 1459 1460

	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
		return -ENOMEM;

	motg->pdata = pdata;

	id = of_match_device(msm_otg_dt_match, &pdev->dev);
1461
	pdata->phy_type = (enum msm_usb_phy_type) id->data;
1462

1463 1464 1465 1466 1467 1468
	motg->link_rst = devm_reset_control_get(&pdev->dev, "link");
	if (IS_ERR(motg->link_rst))
		return PTR_ERR(motg->link_rst);

	motg->phy_rst = devm_reset_control_get(&pdev->dev, "phy");
	if (IS_ERR(motg->phy_rst))
1469
		motg->phy_rst = NULL;
1470

1471 1472 1473 1474 1475 1476 1477 1478 1479
	pdata->mode = of_usb_get_dr_mode(node);
	if (pdata->mode == USB_DR_MODE_UNKNOWN)
		pdata->mode = USB_DR_MODE_OTG;

	pdata->otg_control = OTG_PHY_CONTROL;
	if (!of_property_read_u32(node, "qcom,otg-control", &val))
		if (val == OTG_PMIC_CONTROL)
			pdata->otg_control = val;

1480 1481 1482
	if (!of_property_read_u32(node, "qcom,phy-num", &val) && val < 2)
		motg->phy_number = val;

1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495
	motg->vdd_levels[VDD_LEVEL_NONE] = USB_PHY_SUSP_DIG_VOL;
	motg->vdd_levels[VDD_LEVEL_MIN] = USB_PHY_VDD_DIG_VOL_MIN;
	motg->vdd_levels[VDD_LEVEL_MAX] = USB_PHY_VDD_DIG_VOL_MAX;

	if (of_get_property(node, "qcom,vdd-levels", &len) &&
	    len == sizeof(tmp)) {
		of_property_read_u32_array(node, "qcom,vdd-levels",
					   tmp, len / sizeof(*tmp));
		motg->vdd_levels[VDD_LEVEL_NONE] = tmp[VDD_LEVEL_NONE];
		motg->vdd_levels[VDD_LEVEL_MIN] = tmp[VDD_LEVEL_MIN];
		motg->vdd_levels[VDD_LEVEL_MAX] = tmp[VDD_LEVEL_MAX];
	}

1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
	prop = of_find_property(node, "qcom,phy-init-sequence", &len);
	if (!prop || !len)
		return 0;

	words = len / sizeof(u32);

	if (words >= ULPI_EXT_VENDOR_SPECIFIC) {
		dev_warn(&pdev->dev, "Too big PHY init sequence %d\n", words);
		return 0;
	}

	pdata->phy_init_seq = devm_kzalloc(&pdev->dev, len, GFP_KERNEL);
	if (!pdata->phy_init_seq) {
		dev_warn(&pdev->dev, "No space for PHY init sequence\n");
		return 0;
	}

	ret = of_property_read_u32_array(node, "qcom,phy-init-sequence",
					 pdata->phy_init_seq, words);
	if (!ret)
		pdata->phy_init_sz = words;

	return 0;
}

1521
static int msm_otg_probe(struct platform_device *pdev)
1522
{
1523
	struct regulator_bulk_data regs[3];
1524
	int ret = 0;
1525 1526
	struct device_node *np = pdev->dev.of_node;
	struct msm_otg_platform_data *pdata;
1527 1528
	struct resource *res;
	struct msm_otg *motg;
1529
	struct usb_phy *phy;
1530
	void __iomem *phy_select;
1531

1532
	motg = devm_kzalloc(&pdev->dev, sizeof(struct msm_otg), GFP_KERNEL);
1533 1534 1535 1536 1537
	if (!motg) {
		dev_err(&pdev->dev, "unable to allocate msm_otg\n");
		return -ENOMEM;
	}

1538 1539 1540 1541 1542 1543 1544 1545 1546
	pdata = dev_get_platdata(&pdev->dev);
	if (!pdata) {
		if (!np)
			return -ENXIO;
		ret = msm_otg_read_dt(pdev, motg);
		if (ret)
			return ret;
	}

1547 1548
	motg->phy.otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg),
				     GFP_KERNEL);
1549 1550
	if (!motg->phy.otg) {
		dev_err(&pdev->dev, "unable to allocate msm_otg\n");
1551
		return -ENOMEM;
1552 1553 1554 1555
	}

	phy = &motg->phy;
	phy->dev = &pdev->dev;
1556

1557 1558
	motg->phy_reset_clk = devm_clk_get(&pdev->dev,
					   np ? "phy" : "usb_phy_clk");
1559 1560
	if (IS_ERR(motg->phy_reset_clk)) {
		dev_err(&pdev->dev, "failed to get usb_phy_clk\n");
1561
		motg->phy_reset_clk = NULL;
1562 1563
	}

1564
	motg->clk = devm_clk_get(&pdev->dev, np ? "core" : "usb_hs_clk");
1565 1566
	if (IS_ERR(motg->clk)) {
		dev_err(&pdev->dev, "failed to get usb_hs_clk\n");
1567
		return PTR_ERR(motg->clk);
1568
	}
1569 1570 1571 1572 1573

	/*
	 * If USB Core is running its protocol engine based on CORE CLK,
	 * CORE CLK  must be running at >55Mhz for correct HSUSB
	 * operation and USB core cannot tolerate frequency changes on
1574
	 * CORE CLK.
1575
	 */
1576
	motg->pclk = devm_clk_get(&pdev->dev, np ? "iface" : "usb_hs_pclk");
1577 1578
	if (IS_ERR(motg->pclk)) {
		dev_err(&pdev->dev, "failed to get usb_hs_pclk\n");
1579
		return PTR_ERR(motg->pclk);
1580 1581 1582 1583 1584 1585 1586
	}

	/*
	 * USB core clock is not present on all MSM chips. This
	 * clock is introduced to remove the dependency on AXI
	 * bus frequency.
	 */
1587 1588
	motg->core_clk = devm_clk_get(&pdev->dev,
				      np ? "alt_core" : "usb_hs_core_clk");
1589 1590

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1591 1592 1593 1594 1595
	if (!res)
		return -EINVAL;
	motg->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
	if (!motg->regs)
		return -ENOMEM;
1596

1597 1598 1599 1600 1601 1602 1603
	/*
	 * NOTE: The PHYs can be multiplexed between the chipidea controller
	 * and the dwc3 controller, using a single bit. It is important that
	 * the dwc3 driver does not set this bit in an incompatible way.
	 */
	if (motg->phy_number) {
		phy_select = devm_ioremap_nocache(&pdev->dev, USB2_PHY_SEL, 4);
1604 1605
		if (!phy_select)
			return -ENOMEM;
1606
		/* Enable second PHY with the OTG port */
1607
		writel(0x1, phy_select);
1608 1609
	}

1610 1611 1612
	dev_info(&pdev->dev, "OTG regs = %p\n", motg->regs);

	motg->irq = platform_get_irq(pdev, 0);
1613
	if (motg->irq < 0) {
1614
		dev_err(&pdev->dev, "platform_get_irq failed\n");
1615 1616 1617
		return motg->irq;
	}

1618 1619 1620
	regs[0].supply = "vddcx";
	regs[1].supply = "v3p3";
	regs[2].supply = "v1p8";
1621 1622 1623 1624 1625 1626 1627 1628 1629 1630

	ret = devm_regulator_bulk_get(motg->phy.dev, ARRAY_SIZE(regs), regs);
	if (ret)
		return ret;

	motg->vddcx = regs[0].consumer;
	motg->v3p3  = regs[1].consumer;
	motg->v1p8  = regs[2].consumer;

	clk_set_rate(motg->clk, 60000000);
1631

1632 1633
	clk_prepare_enable(motg->clk);
	clk_prepare_enable(motg->pclk);
1634

1635 1636 1637
	if (!IS_ERR(motg->core_clk))
		clk_prepare_enable(motg->core_clk);

1638 1639 1640
	ret = msm_hsusb_init_vddcx(motg, 1);
	if (ret) {
		dev_err(&pdev->dev, "hsusb vddcx configuration failed\n");
1641
		goto disable_clks;
1642 1643 1644 1645 1646
	}

	ret = msm_hsusb_ldo_init(motg, 1);
	if (ret) {
		dev_err(&pdev->dev, "hsusb vreg configuration failed\n");
1647
		goto disable_vddcx;
1648
	}
1649
	ret = msm_hsusb_ldo_set_mode(motg, 1);
1650 1651
	if (ret) {
		dev_err(&pdev->dev, "hsusb vreg enable failed\n");
1652
		goto disable_ldo;
1653 1654
	}

1655 1656 1657 1658
	writel(0, USB_USBINTR);
	writel(0, USB_OTGSC);

	INIT_WORK(&motg->sm_work, msm_otg_sm_work);
1659
	INIT_DELAYED_WORK(&motg->chg_work, msm_chg_detect_work);
1660
	ret = devm_request_irq(&pdev->dev, motg->irq, msm_otg_irq, IRQF_SHARED,
1661 1662 1663
					"msm_otg", motg);
	if (ret) {
		dev_err(&pdev->dev, "request irq failed\n");
1664
		goto disable_ldo;
1665 1666
	}

1667
	phy->init = msm_phy_init;
1668
	phy->set_power = msm_otg_set_power;
1669
	phy->notify_disconnect = msm_phy_notify_disconnect;
1670
	phy->type = USB_PHY_TYPE_USB2;
1671 1672

	phy->io_ops = &msm_otg_io_ops;
1673

1674 1675 1676
	phy->otg->phy = &motg->phy;
	phy->otg->set_host = msm_otg_set_host;
	phy->otg->set_peripheral = msm_otg_set_peripheral;
1677

1678 1679
	msm_usb_reset(phy);

1680
	ret = usb_add_phy_dev(&motg->phy);
1681
	if (ret) {
1682
		dev_err(&pdev->dev, "usb_add_phy failed\n");
1683
		goto disable_ldo;
1684 1685 1686 1687 1688
	}

	platform_set_drvdata(pdev, motg);
	device_init_wakeup(&pdev->dev, 1);

1689
	if (motg->pdata->mode == USB_DR_MODE_OTG &&
1690
		motg->pdata->otg_control == OTG_USER_CONTROL) {
1691 1692
		ret = msm_otg_debugfs_init(motg);
		if (ret)
1693
			dev_dbg(&pdev->dev, "Can not create mode change file\n");
1694 1695
	}

1696 1697
	pm_runtime_set_active(&pdev->dev);
	pm_runtime_enable(&pdev->dev);
1698

1699
	return 0;
1700 1701 1702 1703 1704

disable_ldo:
	msm_hsusb_ldo_init(motg, 0);
disable_vddcx:
	msm_hsusb_init_vddcx(motg, 0);
1705
disable_clks:
1706 1707
	clk_disable_unprepare(motg->pclk);
	clk_disable_unprepare(motg->clk);
1708 1709
	if (!IS_ERR(motg->core_clk))
		clk_disable_unprepare(motg->core_clk);
1710 1711 1712
	return ret;
}

B
Bill Pemberton 已提交
1713
static int msm_otg_remove(struct platform_device *pdev)
1714 1715
{
	struct msm_otg *motg = platform_get_drvdata(pdev);
1716
	struct usb_phy *phy = &motg->phy;
1717
	int cnt = 0;
1718

1719
	if (phy->otg->host || phy->otg->gadget)
1720 1721 1722
		return -EBUSY;

	msm_otg_debugfs_cleanup();
1723
	cancel_delayed_work_sync(&motg->chg_work);
1724
	cancel_work_sync(&motg->sm_work);
1725

1726
	pm_runtime_resume(&pdev->dev);
1727

1728
	device_init_wakeup(&pdev->dev, 0);
1729
	pm_runtime_disable(&pdev->dev);
1730

1731
	usb_remove_phy(phy);
1732
	disable_irq(motg->irq);
1733

1734 1735 1736
	/*
	 * Put PHY in low power mode.
	 */
1737 1738
	ulpi_read(phy, 0x14);
	ulpi_write(phy, 0x08, 0x09);
1739 1740 1741 1742 1743 1744 1745 1746 1747

	writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC);
	while (cnt < PHY_SUSPEND_TIMEOUT_USEC) {
		if (readl(USB_PORTSC) & PORTSC_PHCD)
			break;
		udelay(1);
		cnt++;
	}
	if (cnt >= PHY_SUSPEND_TIMEOUT_USEC)
1748
		dev_err(phy->dev, "Unable to suspend PHY\n");
1749

1750 1751
	clk_disable_unprepare(motg->pclk);
	clk_disable_unprepare(motg->clk);
1752
	if (!IS_ERR(motg->core_clk))
1753
		clk_disable_unprepare(motg->core_clk);
1754
	msm_hsusb_ldo_init(motg, 0);
1755

1756
	pm_runtime_set_suspended(&pdev->dev);
1757 1758 1759 1760

	return 0;
}

1761 1762 1763 1764
#ifdef CONFIG_PM_RUNTIME
static int msm_otg_runtime_idle(struct device *dev)
{
	struct msm_otg *motg = dev_get_drvdata(dev);
1765
	struct usb_otg *otg = motg->phy.otg;
1766 1767 1768 1769 1770 1771 1772 1773 1774

	dev_dbg(dev, "OTG runtime idle\n");

	/*
	 * It is observed some times that a spurious interrupt
	 * comes when PHY is put into LPM immediately after PHY reset.
	 * This 1 sec delay also prevents entering into LPM immediately
	 * after asynchronous interrupt.
	 */
1775
	if (otg->phy->state != OTG_STATE_UNDEFINED)
1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797
		pm_schedule_suspend(dev, 1000);

	return -EAGAIN;
}

static int msm_otg_runtime_suspend(struct device *dev)
{
	struct msm_otg *motg = dev_get_drvdata(dev);

	dev_dbg(dev, "OTG runtime suspend\n");
	return msm_otg_suspend(motg);
}

static int msm_otg_runtime_resume(struct device *dev)
{
	struct msm_otg *motg = dev_get_drvdata(dev);

	dev_dbg(dev, "OTG runtime resume\n");
	return msm_otg_resume(motg);
}
#endif

1798
#ifdef CONFIG_PM_SLEEP
1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830
static int msm_otg_pm_suspend(struct device *dev)
{
	struct msm_otg *motg = dev_get_drvdata(dev);

	dev_dbg(dev, "OTG PM suspend\n");
	return msm_otg_suspend(motg);
}

static int msm_otg_pm_resume(struct device *dev)
{
	struct msm_otg *motg = dev_get_drvdata(dev);
	int ret;

	dev_dbg(dev, "OTG PM resume\n");

	ret = msm_otg_resume(motg);
	if (ret)
		return ret;

	/*
	 * Runtime PM Documentation recommends bringing the
	 * device to full powered state upon resume.
	 */
	pm_runtime_disable(dev);
	pm_runtime_set_active(dev);
	pm_runtime_enable(dev);

	return 0;
}
#endif

static const struct dev_pm_ops msm_otg_dev_pm_ops = {
1831 1832 1833
	SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume)
	SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume,
				msm_otg_runtime_idle)
1834 1835
};

1836
static struct platform_driver msm_otg_driver = {
1837
	.probe = msm_otg_probe,
B
Bill Pemberton 已提交
1838
	.remove = msm_otg_remove,
1839 1840 1841
	.driver = {
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
1842
		.pm = &msm_otg_dev_pm_ops,
1843
		.of_match_table = msm_otg_dt_match,
1844 1845 1846
	},
};

1847
module_platform_driver(msm_otg_driver);
1848 1849 1850

MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("MSM USB transceiver driver");