phy-msm-usb.c 43.7 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 65 66 67 68 69 70

#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 */

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

	if (init) {
71
		ret = regulator_set_voltage(motg->vddcx,
72 73 74
				USB_PHY_VDD_DIG_VOL_MIN,
				USB_PHY_VDD_DIG_VOL_MAX);
		if (ret) {
75
			dev_err(motg->phy.dev, "Cannot set vddcx voltage\n");
76 77 78
			return ret;
		}

79
		ret = regulator_enable(motg->vddcx);
80
		if (ret)
81
			dev_err(motg->phy.dev, "unable to enable hsusb vddcx\n");
82
	} else {
83
		ret = regulator_set_voltage(motg->vddcx, 0,
84
			USB_PHY_VDD_DIG_VOL_MAX);
85
		if (ret)
86
			dev_err(motg->phy.dev, "Cannot set vddcx voltage\n");
87
		ret = regulator_disable(motg->vddcx);
88
		if (ret)
89
			dev_err(motg->phy.dev, "unable to disable hsusb vddcx\n");
90 91 92 93 94 95 96 97 98 99
	}

	return ret;
}

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

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

		return 0;
	}

126
	regulator_disable(motg->v1p8);
127
disable_3p3:
128
	regulator_disable(motg->v3p3);
129
exit:
130 131 132
	return rc;
}

133
static int msm_hsusb_ldo_set_mode(struct msm_otg *motg, int on)
134 135 136 137
{
	int ret = 0;

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

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

167
static int ulpi_read(struct usb_phy *phy, u32 reg)
168
{
169
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
	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) {
185
		dev_err(phy->dev, "ulpi_read: timeout %08x\n",
186 187 188 189 190 191
			readl(USB_ULPI_VIEWPORT));
		return -ETIMEDOUT;
	}
	return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT));
}

192
static int ulpi_write(struct usb_phy *phy, u32 val, u32 reg)
193
{
194
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
	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) {
211
		dev_err(phy->dev, "ulpi_write: timeout\n");
212 213 214 215 216
		return -ETIMEDOUT;
	}
	return 0;
}

217
static struct usb_phy_io_ops msm_otg_io_ops = {
218 219 220 221 222 223 224
	.read = ulpi_read,
	.write = ulpi_write,
};

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

228 229 230
	for (idx = 0; idx < pdata->phy_init_sz; idx++) {
		if (seq[idx] == -1)
			continue;
231

232
		dev_vdbg(motg->phy.dev, "ulpi: write 0x%02x to 0x%02x\n",
233 234
				seq[idx], addr + idx);
		ulpi_write(&motg->phy, seq[idx], addr + idx);
235 236 237
	}
}

238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
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;
}

255 256
static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert)
{
257
	int ret;
258

259 260 261 262 263 264
	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);
265 266 267 268

	if (ret)
		dev_err(motg->phy.dev, "usb link clk reset %s failed\n",
			assert ? "assert" : "deassert");
269 270 271 272 273 274

	return ret;
}

static int msm_otg_phy_clk_reset(struct msm_otg *motg)
{
275
	int ret;
276

277 278 279 280
	if (motg->pdata->phy_clk_reset)
		ret = motg->pdata->phy_clk_reset(motg->phy_reset_clk);
	else
		ret = reset_control_reset(motg->phy_rst);
281

282
	if (ret)
283 284
		dev_err(motg->phy.dev, "usb phy clk reset failed\n");

285 286 287
	return ret;
}

288
static int msm_link_reset(struct msm_otg *motg)
289 290 291 292 293 294 295 296
{
	u32 val;
	int ret;

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

297 298
	/* wait for 1ms delay as suggested in HPG. */
	usleep_range(1000, 1200);
299

300
	ret = msm_otg_link_clk_reset(motg, 0);
301 302 303
	if (ret)
		return ret;

304 305 306
	if (motg->phy_number)
		writel(readl(USB_PHY_CTRL2) | BIT(16), USB_PHY_CTRL2);

307
	/* put transceiver in serial mode as part of reset */
308
	val = readl(USB_PORTSC) & ~PORTSC_PTS_MASK;
309
	writel(val | PORTSC_PTS_SERIAL, USB_PORTSC);
310

311 312 313
	return 0;
}

314
static int msm_otg_reset(struct usb_phy *phy)
315
{
316
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
317 318 319 320 321 322 323 324 325 326 327 328
	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;

329 330 331
	/* select ULPI phy and clear other status/control bits in PORTSC */
	writel(PORTSC_PTS_ULPI, USB_PORTSC);

332 333 334 335 336 337 338 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
	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;
	}
386 387 388

	msleep(100);

389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
	/* 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);
412 413 414

	if (pdata->otg_control == OTG_PHY_CONTROL) {
		val = readl(USB_OTGSC);
415
		if (pdata->mode == USB_DR_MODE_OTG) {
416 417
			ulpi_val = ULPI_INT_IDGRD | ULPI_INT_SESS_VALID;
			val |= OTGSC_IDIE | OTGSC_BSVIE;
418
		} else if (pdata->mode == USB_DR_MODE_PERIPHERAL) {
419 420 421 422
			ulpi_val = ULPI_INT_SESS_VALID;
			val |= OTGSC_BSVIE;
		}
		writel(val, USB_OTGSC);
423 424
		ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_RISE);
		ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_FALL);
425 426
	}

427 428 429
	if (motg->phy_number)
		writel(readl(USB_PHY_CTRL2) | BIT(16), USB_PHY_CTRL2);

430 431 432
	return 0;
}

433
#define PHY_SUSPEND_TIMEOUT_USEC	(500 * 1000)
434 435
#define PHY_RESUME_TIMEOUT_USEC	(100 * 1000)

436 437 438
#ifdef CONFIG_PM

#define USB_PHY_SUSP_DIG_VOL  500000
439
static int msm_hsusb_config_vddcx(struct msm_otg *motg, int high)
440 441 442 443 444 445 446 447 448 449
{
	int max_vol = USB_PHY_VDD_DIG_VOL_MAX;
	int min_vol;
	int ret;

	if (high)
		min_vol = USB_PHY_VDD_DIG_VOL_MIN;
	else
		min_vol = USB_PHY_SUSP_DIG_VOL;

450
	ret = regulator_set_voltage(motg->vddcx, min_vol, max_vol);
451
	if (ret) {
452
		pr_err("Cannot set vddcx voltage\n");
453 454 455 456 457 458 459 460
		return ret;
	}

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

	return ret;
}

461 462
static int msm_otg_suspend(struct msm_otg *motg)
{
463 464
	struct usb_phy *phy = &motg->phy;
	struct usb_bus *bus = phy->otg->host;
465
	struct msm_otg_platform_data *pdata = motg->pdata;
466
	void __iomem *addr;
467 468 469 470 471 472 473
	int cnt = 0;

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

	disable_irq(motg->irq);
	/*
474 475
	 * Chipidea 45-nm PHY suspend sequence:
	 *
476 477 478 479
	 * 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).
480
	 *
481 482 483 484
	 * 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.
485
	 *
486 487 488
	 * PLL is not turned off when PHY enters into low power mode (LPM).
	 * Disable PLL for maximum power savings.
	 */
489 490

	if (motg->pdata->phy_type == CI_45NM_INTEGRATED_PHY) {
491
		ulpi_read(phy, 0x14);
492
		if (pdata->otg_control == OTG_PHY_CONTROL)
493 494
			ulpi_write(phy, 0x01, 0x30);
		ulpi_write(phy, 0x08, 0x09);
495
	}
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510

	/*
	 * 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) {
511 512
		dev_err(phy->dev, "Unable to suspend PHY\n");
		msm_otg_reset(phy);
513 514 515 516 517 518 519 520 521 522 523 524 525
		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);

526 527 528 529
	addr = USB_PHY_CTRL;
	if (motg->phy_number)
		addr = USB_PHY_CTRL2;

530 531
	if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY &&
			motg->pdata->otg_control == OTG_PMIC_CONTROL)
532
		writel(readl(addr) | PHY_RETEN, addr);
533

534 535
	clk_disable_unprepare(motg->pclk);
	clk_disable_unprepare(motg->clk);
536
	if (!IS_ERR(motg->core_clk))
537
		clk_disable_unprepare(motg->core_clk);
538

539 540
	if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY &&
			motg->pdata->otg_control == OTG_PMIC_CONTROL) {
541 542
		msm_hsusb_ldo_set_mode(motg, 0);
		msm_hsusb_config_vddcx(motg, 0);
543 544
	}

545
	if (device_may_wakeup(phy->dev))
546 547 548 549 550 551 552
		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);

553
	dev_info(phy->dev, "USB in low power mode\n");
554 555 556 557 558 559

	return 0;
}

static int msm_otg_resume(struct msm_otg *motg)
{
560 561
	struct usb_phy *phy = &motg->phy;
	struct usb_bus *bus = phy->otg->host;
562
	void __iomem *addr;
563 564 565 566 567 568
	int cnt = 0;
	unsigned temp;

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

569 570
	clk_prepare_enable(motg->pclk);
	clk_prepare_enable(motg->clk);
571
	if (!IS_ERR(motg->core_clk))
572
		clk_prepare_enable(motg->core_clk);
573

574 575
	if (motg->pdata->phy_type == SNPS_28NM_INTEGRATED_PHY &&
			motg->pdata->otg_control == OTG_PMIC_CONTROL) {
576 577 578 579 580

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

581 582
		msm_hsusb_ldo_set_mode(motg, 1);
		msm_hsusb_config_vddcx(motg, 1);
583
		writel(readl(addr) & ~PHY_RETEN, addr);
584 585
	}

586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
	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.
		 */
612
		dev_err(phy->dev, "Unable to resume USB. Re-plugin the cable\n");
613
		msm_otg_reset(phy);
614 615 616
	}

skip_phy_resume:
617
	if (device_may_wakeup(phy->dev))
618 619 620 621
		disable_irq_wake(motg->irq);
	if (bus)
		set_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags);

622 623
	atomic_set(&motg->in_lpm, 0);

624 625
	if (motg->async_int) {
		motg->async_int = 0;
626
		pm_runtime_put(phy->dev);
627 628 629
		enable_irq(motg->irq);
	}

630
	dev_info(phy->dev, "USB exited from low power mode\n");
631 632 633

	return 0;
}
634
#endif
635

636 637 638 639 640 641
static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA)
{
	if (motg->cur_power == mA)
		return;

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

646
static int msm_otg_set_power(struct usb_phy *phy, unsigned mA)
647
{
648
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
649 650 651 652 653 654 655 656 657 658 659 660 661 662

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

663
static void msm_otg_start_host(struct usb_phy *phy, int on)
664
{
665
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
666 667 668
	struct msm_otg_platform_data *pdata = motg->pdata;
	struct usb_hcd *hcd;

669
	if (!phy->otg->host)
670 671
		return;

672
	hcd = bus_to_hcd(phy->otg->host);
673 674

	if (on) {
675
		dev_dbg(phy->dev, "host on\n");
676 677 678 679 680 681 682 683 684 685 686 687

		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);
688
		device_wakeup_enable(hcd->self.controller);
689 690
#endif
	} else {
691
		dev_dbg(phy->dev, "host off\n");
692 693 694 695 696 697 698 699 700 701 702

#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);
	}
}

703
static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
704
{
705
	struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
706 707 708 709 710 711
	struct usb_hcd *hcd;

	/*
	 * Fail host registration if this board can support
	 * only peripheral configuration.
	 */
712
	if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL) {
713
		dev_info(otg->phy->dev, "Host mode is not supported\n");
714 715 716 717
		return -ENODEV;
	}

	if (!host) {
718 719 720
		if (otg->phy->state == OTG_STATE_A_HOST) {
			pm_runtime_get_sync(otg->phy->dev);
			msm_otg_start_host(otg->phy, 0);
721
			otg->host = NULL;
722
			otg->phy->state = OTG_STATE_UNDEFINED;
723 724 725 726 727 728 729 730 731 732 733 734
			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;
735
	dev_dbg(otg->phy->dev, "host driver registered w/ tranceiver\n");
736 737 738 739 740

	/*
	 * Kick the state machine work, if peripheral is not supported
	 * or peripheral is already registered with us.
	 */
741
	if (motg->pdata->mode == USB_DR_MODE_HOST || otg->gadget) {
742
		pm_runtime_get_sync(otg->phy->dev);
743
		schedule_work(&motg->sm_work);
744
	}
745 746 747 748

	return 0;
}

749
static void msm_otg_start_peripheral(struct usb_phy *phy, int on)
750
{
751
	struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
752 753
	struct msm_otg_platform_data *pdata = motg->pdata;

754
	if (!phy->otg->gadget)
755 756 757
		return;

	if (on) {
758
		dev_dbg(phy->dev, "gadget on\n");
759 760 761 762 763 764 765
		/*
		 * 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);
766
		usb_gadget_vbus_connect(phy->otg->gadget);
767
	} else {
768 769
		dev_dbg(phy->dev, "gadget off\n");
		usb_gadget_vbus_disconnect(phy->otg->gadget);
770 771 772 773 774 775
		if (pdata->setup_gpio)
			pdata->setup_gpio(OTG_STATE_UNDEFINED);
	}

}

776 777
static int msm_otg_set_peripheral(struct usb_otg *otg,
					struct usb_gadget *gadget)
778
{
779
	struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy);
780 781 782 783 784

	/*
	 * Fail peripheral registration if this board can support
	 * only host configuration.
	 */
785
	if (motg->pdata->mode == USB_DR_MODE_HOST) {
786
		dev_info(otg->phy->dev, "Peripheral mode is not supported\n");
787 788 789 790
		return -ENODEV;
	}

	if (!gadget) {
791 792 793
		if (otg->phy->state == OTG_STATE_B_PERIPHERAL) {
			pm_runtime_get_sync(otg->phy->dev);
			msm_otg_start_peripheral(otg->phy, 0);
794
			otg->gadget = NULL;
795
			otg->phy->state = OTG_STATE_UNDEFINED;
796 797 798 799 800 801 802 803
			schedule_work(&motg->sm_work);
		} else {
			otg->gadget = NULL;
		}

		return 0;
	}
	otg->gadget = gadget;
804
	dev_dbg(otg->phy->dev, "peripheral driver registered w/ tranceiver\n");
805 806 807 808 809

	/*
	 * Kick the state machine work, if host is not supported
	 * or host is already registered with us.
	 */
810
	if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL || otg->host) {
811
		pm_runtime_get_sync(otg->phy->dev);
812
		schedule_work(&motg->sm_work);
813
	}
814 815 816 817

	return 0;
}

818 819
static bool msm_chg_check_secondary_det(struct msm_otg *motg)
{
820
	struct usb_phy *phy = &motg->phy;
821 822 823 824 825
	u32 chg_det;
	bool ret = false;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
826
		chg_det = ulpi_read(phy, 0x34);
827 828 829
		ret = chg_det & (1 << 4);
		break;
	case SNPS_28NM_INTEGRATED_PHY:
830
		chg_det = ulpi_read(phy, 0x87);
831 832 833 834 835 836 837 838 839 840
		ret = chg_det & 1;
		break;
	default:
		break;
	}
	return ret;
}

static void msm_chg_enable_secondary_det(struct msm_otg *motg)
{
841
	struct usb_phy *phy = &motg->phy;
842 843 844 845
	u32 chg_det;

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

static bool msm_chg_check_primary_det(struct msm_otg *motg)
{
881
	struct usb_phy *phy = &motg->phy;
882 883 884 885 886
	u32 chg_det;
	bool ret = false;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
887
		chg_det = ulpi_read(phy, 0x34);
888 889 890
		ret = chg_det & (1 << 4);
		break;
	case SNPS_28NM_INTEGRATED_PHY:
891
		chg_det = ulpi_read(phy, 0x87);
892 893 894 895 896 897 898 899 900 901
		ret = chg_det & 1;
		break;
	default:
		break;
	}
	return ret;
}

static void msm_chg_enable_primary_det(struct msm_otg *motg)
{
902
	struct usb_phy *phy = &motg->phy;
903 904 905 906
	u32 chg_det;

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

static bool msm_chg_check_dcd(struct msm_otg *motg)
{
927
	struct usb_phy *phy = &motg->phy;
928 929 930 931 932
	u32 line_state;
	bool ret = false;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
933
		line_state = ulpi_read(phy, 0x15);
934 935 936
		ret = !(line_state & 1);
		break;
	case SNPS_28NM_INTEGRATED_PHY:
937
		line_state = ulpi_read(phy, 0x87);
938 939 940 941 942 943 944 945 946 947
		ret = line_state & 2;
		break;
	default:
		break;
	}
	return ret;
}

static void msm_chg_disable_dcd(struct msm_otg *motg)
{
948
	struct usb_phy *phy = &motg->phy;
949 950 951 952
	u32 chg_det;

	switch (motg->pdata->phy_type) {
	case CI_45NM_INTEGRATED_PHY:
953
		chg_det = ulpi_read(phy, 0x34);
954
		chg_det &= ~(1 << 5);
955
		ulpi_write(phy, chg_det, 0x34);
956 957
		break;
	case SNPS_28NM_INTEGRATED_PHY:
958
		ulpi_write(phy, 0x10, 0x86);
959 960 961 962 963 964 965 966
		break;
	default:
		break;
	}
}

static void msm_chg_enable_dcd(struct msm_otg *motg)
{
967
	struct usb_phy *phy = &motg->phy;
968 969 970 971
	u32 chg_det;

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

static void msm_chg_block_on(struct msm_otg *motg)
{
988
	struct usb_phy *phy = &motg->phy;
989 990 991
	u32 func_ctrl, chg_det;

	/* put the controller in non-driving mode */
992
	func_ctrl = ulpi_read(phy, ULPI_FUNC_CTRL);
993 994
	func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
	func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
995
	ulpi_write(phy, func_ctrl, ULPI_FUNC_CTRL);
996 997 998

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

static void msm_chg_block_off(struct msm_otg *motg)
{
1023
	struct usb_phy *phy = &motg->phy;
1024 1025 1026 1027
	u32 func_ctrl, chg_det;

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

	/* put the controller in normal mode */
1045
	func_ctrl = ulpi_read(phy, ULPI_FUNC_CTRL);
1046 1047
	func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
	func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NORMAL;
1048
	ulpi_write(phy, func_ctrl, ULPI_FUNC_CTRL);
1049 1050 1051 1052 1053 1054 1055 1056 1057
}

#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);
1058
	struct usb_phy *phy = &motg->phy;
1059 1060 1061
	bool is_dcd, tmout, vout;
	unsigned long delay;

1062
	dev_dbg(phy->dev, "chg detection work\n");
1063 1064
	switch (motg->chg_state) {
	case USB_CHG_STATE_UNDEFINED:
1065
		pm_runtime_get_sync(phy->dev);
1066 1067 1068 1069 1070 1071 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
		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);
1108
		dev_dbg(phy->dev, "charger = %d\n", motg->chg_type);
1109 1110 1111 1112 1113 1114 1115 1116 1117
		schedule_work(&motg->sm_work);
		return;
	default:
		return;
	}

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

1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
/*
 * 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) {
1131
	case USB_DR_MODE_OTG:
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
		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;
1147
	case USB_DR_MODE_HOST:
1148 1149
		clear_bit(ID, &motg->inputs);
		break;
1150
	case USB_DR_MODE_PERIPHERAL:
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164
		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);
1165
	struct usb_otg *otg = motg->phy.otg;
1166

1167
	switch (otg->phy->state) {
1168
	case OTG_STATE_UNDEFINED:
1169 1170
		dev_dbg(otg->phy->dev, "OTG_STATE_UNDEFINED state\n");
		msm_otg_reset(otg->phy);
1171
		msm_otg_init_sm(motg);
1172
		otg->phy->state = OTG_STATE_B_IDLE;
1173 1174
		/* FALL THROUGH */
	case OTG_STATE_B_IDLE:
1175
		dev_dbg(otg->phy->dev, "OTG_STATE_B_IDLE state\n");
1176 1177 1178
		if (!test_bit(ID, &motg->inputs) && otg->host) {
			/* disable BSV bit */
			writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
1179 1180
			msm_otg_start_host(otg->phy, 1);
			otg->phy->state = OTG_STATE_A_HOST;
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
		} 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);
1195 1196 1197
					msm_otg_start_peripheral(otg->phy, 1);
					otg->phy->state
						= OTG_STATE_B_PERIPHERAL;
1198 1199 1200
					break;
				case USB_SDP_CHARGER:
					msm_otg_notify_charger(motg, IUNIT);
1201 1202 1203
					msm_otg_start_peripheral(otg->phy, 1);
					otg->phy->state
						= OTG_STATE_B_PERIPHERAL;
1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218
					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)) {
1219 1220
				pm_runtime_put_sync(otg->phy->dev);
				msm_otg_reset(otg->phy);
1221 1222 1223 1224
			}
			msm_otg_notify_charger(motg, 0);
			motg->chg_state = USB_CHG_STATE_UNDEFINED;
			motg->chg_type = USB_INVALID_CHARGER;
1225
		}
1226
		pm_runtime_put_sync(otg->phy->dev);
1227 1228
		break;
	case OTG_STATE_B_PERIPHERAL:
1229
		dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
1230 1231
		if (!test_bit(B_SESS_VLD, &motg->inputs) ||
				!test_bit(ID, &motg->inputs)) {
1232
			msm_otg_notify_charger(motg, 0);
1233
			msm_otg_start_peripheral(otg->phy, 0);
1234 1235
			motg->chg_state = USB_CHG_STATE_UNDEFINED;
			motg->chg_type = USB_INVALID_CHARGER;
1236 1237
			otg->phy->state = OTG_STATE_B_IDLE;
			msm_otg_reset(otg->phy);
1238 1239 1240 1241
			schedule_work(w);
		}
		break;
	case OTG_STATE_A_HOST:
1242
		dev_dbg(otg->phy->dev, "OTG_STATE_A_HOST state\n");
1243
		if (test_bit(ID, &motg->inputs)) {
1244 1245 1246
			msm_otg_start_host(otg->phy, 0);
			otg->phy->state = OTG_STATE_B_IDLE;
			msm_otg_reset(otg->phy);
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257
			schedule_work(w);
		}
		break;
	default:
		break;
	}
}

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

1261 1262 1263
	if (atomic_read(&motg->in_lpm)) {
		disable_irq_nosync(irq);
		motg->async_int = 1;
1264
		pm_runtime_get(phy->dev);
1265 1266 1267
		return IRQ_HANDLED;
	}

1268 1269 1270 1271 1272 1273 1274 1275 1276
	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);
1277 1278
		dev_dbg(phy->dev, "ID set/clear\n");
		pm_runtime_get_noresume(phy->dev);
1279 1280 1281 1282 1283
	} 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);
1284 1285
		dev_dbg(phy->dev, "BSV set/clear\n");
		pm_runtime_get_noresume(phy->dev);
1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
	}

	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;
1296
	struct usb_otg *otg = motg->phy.otg;
1297

1298
	switch (otg->phy->state) {
1299
	case OTG_STATE_A_HOST:
1300
		seq_puts(s, "host\n");
1301 1302
		break;
	case OTG_STATE_B_PERIPHERAL:
1303
		seq_puts(s, "peripheral\n");
1304 1305
		break;
	default:
1306
		seq_puts(s, "none\n");
1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
		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)
{
1321 1322
	struct seq_file *s = file->private_data;
	struct msm_otg *motg = s->private;
1323
	char buf[16];
1324
	struct usb_otg *otg = motg->phy.otg;
1325
	int status = count;
1326
	enum usb_dr_mode req_mode;
1327 1328 1329 1330 1331 1332 1333 1334 1335

	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)) {
1336
		req_mode = USB_DR_MODE_HOST;
1337
	} else if (!strncmp(buf, "peripheral", 10)) {
1338
		req_mode = USB_DR_MODE_PERIPHERAL;
1339
	} else if (!strncmp(buf, "none", 4)) {
1340
		req_mode = USB_DR_MODE_UNKNOWN;
1341 1342 1343 1344 1345 1346
	} else {
		status = -EINVAL;
		goto out;
	}

	switch (req_mode) {
1347
	case USB_DR_MODE_UNKNOWN:
1348
		switch (otg->phy->state) {
1349 1350 1351 1352 1353 1354 1355 1356 1357
		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;
1358
	case USB_DR_MODE_PERIPHERAL:
1359
		switch (otg->phy->state) {
1360 1361 1362 1363 1364 1365 1366 1367 1368
		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;
1369
	case USB_DR_MODE_HOST:
1370
		switch (otg->phy->state) {
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382
		case OTG_STATE_B_IDLE:
		case OTG_STATE_B_PERIPHERAL:
			clear_bit(ID, &motg->inputs);
			break;
		default:
			goto out;
		}
		break;
	default:
		goto out;
	}

1383
	pm_runtime_get_sync(otg->phy->dev);
1384 1385 1386 1387 1388 1389 1390 1391 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
	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);
}

1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454
static struct of_device_id msm_otg_dt_match[] = {
	{
		.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;
	u32 val;

	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);
	pdata->phy_type = (int) id->data;

1455 1456 1457 1458 1459 1460 1461 1462
	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))
		return PTR_ERR(motg->phy_rst);

1463 1464 1465 1466 1467 1468 1469 1470 1471
	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;

1472 1473 1474
	if (!of_property_read_u32(node, "qcom,phy-num", &val) && val < 2)
		motg->phy_number = val;

1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
	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;
}

1500
static int msm_otg_probe(struct platform_device *pdev)
1501
{
1502
	struct regulator_bulk_data regs[3];
1503
	int ret = 0;
1504 1505
	struct device_node *np = pdev->dev.of_node;
	struct msm_otg_platform_data *pdata;
1506 1507
	struct resource *res;
	struct msm_otg *motg;
1508
	struct usb_phy *phy;
1509
	void __iomem *phy_select;
1510

1511
	motg = devm_kzalloc(&pdev->dev, sizeof(struct msm_otg), GFP_KERNEL);
1512 1513 1514 1515 1516
	if (!motg) {
		dev_err(&pdev->dev, "unable to allocate msm_otg\n");
		return -ENOMEM;
	}

1517 1518 1519 1520 1521 1522 1523 1524 1525
	pdata = dev_get_platdata(&pdev->dev);
	if (!pdata) {
		if (!np)
			return -ENXIO;
		ret = msm_otg_read_dt(pdev, motg);
		if (ret)
			return ret;
	}

1526 1527
	motg->phy.otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg),
				     GFP_KERNEL);
1528 1529
	if (!motg->phy.otg) {
		dev_err(&pdev->dev, "unable to allocate msm_otg\n");
1530
		return -ENOMEM;
1531 1532 1533 1534
	}

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

1536 1537
	motg->phy_reset_clk = devm_clk_get(&pdev->dev,
					   np ? "phy" : "usb_phy_clk");
1538 1539
	if (IS_ERR(motg->phy_reset_clk)) {
		dev_err(&pdev->dev, "failed to get usb_phy_clk\n");
1540
		return PTR_ERR(motg->phy_reset_clk);
1541 1542
	}

1543
	motg->clk = devm_clk_get(&pdev->dev, np ? "core" : "usb_hs_clk");
1544 1545
	if (IS_ERR(motg->clk)) {
		dev_err(&pdev->dev, "failed to get usb_hs_clk\n");
1546
		return PTR_ERR(motg->clk);
1547
	}
1548 1549 1550 1551 1552

	/*
	 * 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
1553
	 * CORE CLK.
1554
	 */
1555
	motg->pclk = devm_clk_get(&pdev->dev, np ? "iface" : "usb_hs_pclk");
1556 1557
	if (IS_ERR(motg->pclk)) {
		dev_err(&pdev->dev, "failed to get usb_hs_pclk\n");
1558
		return PTR_ERR(motg->pclk);
1559 1560 1561 1562 1563 1564 1565
	}

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

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1570 1571 1572
	motg->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
	if (IS_ERR(motg->regs))
		return PTR_ERR(motg->regs);
1573

1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586
	/*
	 * 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);
		if (IS_ERR(phy_select))
			return PTR_ERR(phy_select);
		/* Enable second PHY with the OTG port */
		writel_relaxed(0x1, phy_select);
	}

1587 1588 1589
	dev_info(&pdev->dev, "OTG regs = %p\n", motg->regs);

	motg->irq = platform_get_irq(pdev, 0);
1590
	if (motg->irq < 0) {
1591
		dev_err(&pdev->dev, "platform_get_irq failed\n");
1592 1593 1594
		return motg->irq;
	}

1595 1596 1597
	regs[0].supply = "vddcx";
	regs[1].supply = "v3p3";
	regs[2].supply = "v1p8";
1598 1599 1600 1601 1602 1603 1604 1605 1606 1607

	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);
1608

1609 1610
	clk_prepare_enable(motg->clk);
	clk_prepare_enable(motg->pclk);
1611

1612 1613 1614
	if (!IS_ERR(motg->core_clk))
		clk_prepare_enable(motg->core_clk);

1615 1616 1617
	ret = msm_hsusb_init_vddcx(motg, 1);
	if (ret) {
		dev_err(&pdev->dev, "hsusb vddcx configuration failed\n");
1618
		goto disable_clks;
1619 1620 1621 1622 1623
	}

	ret = msm_hsusb_ldo_init(motg, 1);
	if (ret) {
		dev_err(&pdev->dev, "hsusb vreg configuration failed\n");
1624
		goto disable_vddcx;
1625
	}
1626
	ret = msm_hsusb_ldo_set_mode(motg, 1);
1627 1628
	if (ret) {
		dev_err(&pdev->dev, "hsusb vreg enable failed\n");
1629
		goto disable_ldo;
1630 1631
	}

1632 1633 1634 1635
	writel(0, USB_USBINTR);
	writel(0, USB_OTGSC);

	INIT_WORK(&motg->sm_work, msm_otg_sm_work);
1636
	INIT_DELAYED_WORK(&motg->chg_work, msm_chg_detect_work);
1637
	ret = devm_request_irq(&pdev->dev, motg->irq, msm_otg_irq, IRQF_SHARED,
1638 1639 1640
					"msm_otg", motg);
	if (ret) {
		dev_err(&pdev->dev, "request irq failed\n");
1641
		goto disable_ldo;
1642 1643
	}

1644
	phy->init = msm_phy_init;
1645
	phy->set_power = msm_otg_set_power;
1646
	phy->notify_disconnect = msm_phy_notify_disconnect;
1647 1648

	phy->io_ops = &msm_otg_io_ops;
1649

1650 1651 1652
	phy->otg->phy = &motg->phy;
	phy->otg->set_host = msm_otg_set_host;
	phy->otg->set_peripheral = msm_otg_set_peripheral;
1653

1654 1655
	msm_usb_reset(phy);

1656
	ret = usb_add_phy(&motg->phy, USB_PHY_TYPE_USB2);
1657
	if (ret) {
1658
		dev_err(&pdev->dev, "usb_add_phy failed\n");
1659
		goto disable_ldo;
1660 1661 1662 1663 1664
	}

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

1665
	if (motg->pdata->mode == USB_DR_MODE_OTG &&
1666
		motg->pdata->otg_control == OTG_USER_CONTROL) {
1667 1668
		ret = msm_otg_debugfs_init(motg);
		if (ret)
1669
			dev_dbg(&pdev->dev, "Can not create mode change file\n");
1670 1671
	}

1672 1673
	pm_runtime_set_active(&pdev->dev);
	pm_runtime_enable(&pdev->dev);
1674

1675
	return 0;
1676 1677 1678 1679 1680

disable_ldo:
	msm_hsusb_ldo_init(motg, 0);
disable_vddcx:
	msm_hsusb_init_vddcx(motg, 0);
1681
disable_clks:
1682 1683
	clk_disable_unprepare(motg->pclk);
	clk_disable_unprepare(motg->clk);
1684 1685
	if (!IS_ERR(motg->core_clk))
		clk_disable_unprepare(motg->core_clk);
1686 1687 1688
	return ret;
}

B
Bill Pemberton 已提交
1689
static int msm_otg_remove(struct platform_device *pdev)
1690 1691
{
	struct msm_otg *motg = platform_get_drvdata(pdev);
1692
	struct usb_phy *phy = &motg->phy;
1693
	int cnt = 0;
1694

1695
	if (phy->otg->host || phy->otg->gadget)
1696 1697 1698
		return -EBUSY;

	msm_otg_debugfs_cleanup();
1699
	cancel_delayed_work_sync(&motg->chg_work);
1700
	cancel_work_sync(&motg->sm_work);
1701

1702
	pm_runtime_resume(&pdev->dev);
1703

1704
	device_init_wakeup(&pdev->dev, 0);
1705
	pm_runtime_disable(&pdev->dev);
1706

1707
	usb_remove_phy(phy);
1708
	disable_irq(motg->irq);
1709

1710 1711 1712
	/*
	 * Put PHY in low power mode.
	 */
1713 1714
	ulpi_read(phy, 0x14);
	ulpi_write(phy, 0x08, 0x09);
1715 1716 1717 1718 1719 1720 1721 1722 1723

	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)
1724
		dev_err(phy->dev, "Unable to suspend PHY\n");
1725

1726 1727
	clk_disable_unprepare(motg->pclk);
	clk_disable_unprepare(motg->clk);
1728
	if (!IS_ERR(motg->core_clk))
1729
		clk_disable_unprepare(motg->core_clk);
1730
	msm_hsusb_ldo_init(motg, 0);
1731

1732
	pm_runtime_set_suspended(&pdev->dev);
1733 1734 1735 1736

	return 0;
}

1737 1738 1739 1740
#ifdef CONFIG_PM_RUNTIME
static int msm_otg_runtime_idle(struct device *dev)
{
	struct msm_otg *motg = dev_get_drvdata(dev);
1741
	struct usb_otg *otg = motg->phy.otg;
1742 1743 1744 1745 1746 1747 1748 1749 1750

	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.
	 */
1751
	if (otg->phy->state != OTG_STATE_UNDEFINED)
1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773
		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

1774
#ifdef CONFIG_PM_SLEEP
1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806
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 = {
1807 1808 1809
	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)
1810 1811
};

1812
static struct platform_driver msm_otg_driver = {
1813
	.probe = msm_otg_probe,
B
Bill Pemberton 已提交
1814
	.remove = msm_otg_remove,
1815 1816 1817
	.driver = {
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
1818
		.pm = &msm_otg_dev_pm_ops,
1819
		.of_match_table = msm_otg_dt_match,
1820 1821 1822
	},
};

1823
module_platform_driver(msm_otg_driver);
1824 1825 1826

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