blob: 854b7e3413ddb9971d54178ad23c1350ff9d1406 [file] [log] [blame]
Pavankumar Kondetid8608522011-05-04 10:19:47 +05301/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05302 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
16 *
17 */
18
19#include <linux/module.h>
20#include <linux/device.h>
21#include <linux/platform_device.h>
22#include <linux/clk.h>
23#include <linux/slab.h>
24#include <linux/interrupt.h>
25#include <linux/err.h>
26#include <linux/delay.h>
27#include <linux/io.h>
28#include <linux/ioport.h>
29#include <linux/uaccess.h>
30#include <linux/debugfs.h>
31#include <linux/seq_file.h>
Pavankumar Kondeti87c01042010-12-07 17:53:58 +053032#include <linux/pm_runtime.h>
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +053033
34#include <linux/usb.h>
35#include <linux/usb/otg.h>
36#include <linux/usb/ulpi.h>
37#include <linux/usb/gadget.h>
38#include <linux/usb/hcd.h>
39#include <linux/usb/msm_hsusb.h>
40#include <linux/usb/msm_hsusb_hw.h>
41
42#include <mach/clk.h>
43
44#define MSM_USB_BASE (motg->regs)
45#define DRIVER_NAME "msm_otg"
46
47#define ULPI_IO_TIMEOUT_USEC (10 * 1000)
48static int ulpi_read(struct otg_transceiver *otg, u32 reg)
49{
50 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
51 int cnt = 0;
52
53 /* initiate read operation */
54 writel(ULPI_RUN | ULPI_READ | ULPI_ADDR(reg),
55 USB_ULPI_VIEWPORT);
56
57 /* wait for completion */
58 while (cnt < ULPI_IO_TIMEOUT_USEC) {
59 if (!(readl(USB_ULPI_VIEWPORT) & ULPI_RUN))
60 break;
61 udelay(1);
62 cnt++;
63 }
64
65 if (cnt >= ULPI_IO_TIMEOUT_USEC) {
66 dev_err(otg->dev, "ulpi_read: timeout %08x\n",
67 readl(USB_ULPI_VIEWPORT));
68 return -ETIMEDOUT;
69 }
70 return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT));
71}
72
73static int ulpi_write(struct otg_transceiver *otg, u32 val, u32 reg)
74{
75 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
76 int cnt = 0;
77
78 /* initiate write operation */
79 writel(ULPI_RUN | ULPI_WRITE |
80 ULPI_ADDR(reg) | ULPI_DATA(val),
81 USB_ULPI_VIEWPORT);
82
83 /* wait for completion */
84 while (cnt < ULPI_IO_TIMEOUT_USEC) {
85 if (!(readl(USB_ULPI_VIEWPORT) & ULPI_RUN))
86 break;
87 udelay(1);
88 cnt++;
89 }
90
91 if (cnt >= ULPI_IO_TIMEOUT_USEC) {
92 dev_err(otg->dev, "ulpi_write: timeout\n");
93 return -ETIMEDOUT;
94 }
95 return 0;
96}
97
98static struct otg_io_access_ops msm_otg_io_ops = {
99 .read = ulpi_read,
100 .write = ulpi_write,
101};
102
103static void ulpi_init(struct msm_otg *motg)
104{
105 struct msm_otg_platform_data *pdata = motg->pdata;
106 int *seq = pdata->phy_init_seq;
107
108 if (!seq)
109 return;
110
111 while (seq[0] >= 0) {
112 dev_vdbg(motg->otg.dev, "ulpi: write 0x%02x to 0x%02x\n",
113 seq[0], seq[1]);
114 ulpi_write(&motg->otg, seq[0], seq[1]);
115 seq += 2;
116 }
117}
118
119static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert)
120{
121 int ret;
122
123 if (assert) {
124 ret = clk_reset(motg->clk, CLK_RESET_ASSERT);
125 if (ret)
126 dev_err(motg->otg.dev, "usb hs_clk assert failed\n");
127 } else {
128 ret = clk_reset(motg->clk, CLK_RESET_DEASSERT);
129 if (ret)
130 dev_err(motg->otg.dev, "usb hs_clk deassert failed\n");
131 }
132 return ret;
133}
134
135static int msm_otg_phy_clk_reset(struct msm_otg *motg)
136{
137 int ret;
138
139 ret = clk_reset(motg->phy_reset_clk, CLK_RESET_ASSERT);
140 if (ret) {
141 dev_err(motg->otg.dev, "usb phy clk assert failed\n");
142 return ret;
143 }
144 usleep_range(10000, 12000);
145 ret = clk_reset(motg->phy_reset_clk, CLK_RESET_DEASSERT);
146 if (ret)
147 dev_err(motg->otg.dev, "usb phy clk deassert failed\n");
148 return ret;
149}
150
151static int msm_otg_phy_reset(struct msm_otg *motg)
152{
153 u32 val;
154 int ret;
155 int retries;
156
157 ret = msm_otg_link_clk_reset(motg, 1);
158 if (ret)
159 return ret;
160 ret = msm_otg_phy_clk_reset(motg);
161 if (ret)
162 return ret;
163 ret = msm_otg_link_clk_reset(motg, 0);
164 if (ret)
165 return ret;
166
167 val = readl(USB_PORTSC) & ~PORTSC_PTS_MASK;
168 writel(val | PORTSC_PTS_ULPI, USB_PORTSC);
169
170 for (retries = 3; retries > 0; retries--) {
171 ret = ulpi_write(&motg->otg, ULPI_FUNC_CTRL_SUSPENDM,
172 ULPI_CLR(ULPI_FUNC_CTRL));
173 if (!ret)
174 break;
175 ret = msm_otg_phy_clk_reset(motg);
176 if (ret)
177 return ret;
178 }
179 if (!retries)
180 return -ETIMEDOUT;
181
182 /* This reset calibrates the phy, if the above write succeeded */
183 ret = msm_otg_phy_clk_reset(motg);
184 if (ret)
185 return ret;
186
187 for (retries = 3; retries > 0; retries--) {
188 ret = ulpi_read(&motg->otg, ULPI_DEBUG);
189 if (ret != -ETIMEDOUT)
190 break;
191 ret = msm_otg_phy_clk_reset(motg);
192 if (ret)
193 return ret;
194 }
195 if (!retries)
196 return -ETIMEDOUT;
197
198 dev_info(motg->otg.dev, "phy_reset: success\n");
199 return 0;
200}
201
202#define LINK_RESET_TIMEOUT_USEC (250 * 1000)
203static int msm_otg_reset(struct otg_transceiver *otg)
204{
205 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
206 struct msm_otg_platform_data *pdata = motg->pdata;
207 int cnt = 0;
208 int ret;
209 u32 val = 0;
210 u32 ulpi_val = 0;
211
212 ret = msm_otg_phy_reset(motg);
213 if (ret) {
214 dev_err(otg->dev, "phy_reset failed\n");
215 return ret;
216 }
217
218 ulpi_init(motg);
219
220 writel(USBCMD_RESET, USB_USBCMD);
221 while (cnt < LINK_RESET_TIMEOUT_USEC) {
222 if (!(readl(USB_USBCMD) & USBCMD_RESET))
223 break;
224 udelay(1);
225 cnt++;
226 }
227 if (cnt >= LINK_RESET_TIMEOUT_USEC)
228 return -ETIMEDOUT;
229
230 /* select ULPI phy */
231 writel(0x80000000, USB_PORTSC);
232
233 msleep(100);
234
235 writel(0x0, USB_AHBBURST);
236 writel(0x00, USB_AHBMODE);
237
238 if (pdata->otg_control == OTG_PHY_CONTROL) {
239 val = readl(USB_OTGSC);
240 if (pdata->mode == USB_OTG) {
241 ulpi_val = ULPI_INT_IDGRD | ULPI_INT_SESS_VALID;
242 val |= OTGSC_IDIE | OTGSC_BSVIE;
243 } else if (pdata->mode == USB_PERIPHERAL) {
244 ulpi_val = ULPI_INT_SESS_VALID;
245 val |= OTGSC_BSVIE;
246 }
247 writel(val, USB_OTGSC);
248 ulpi_write(otg, ulpi_val, ULPI_USB_INT_EN_RISE);
249 ulpi_write(otg, ulpi_val, ULPI_USB_INT_EN_FALL);
250 }
251
252 return 0;
253}
254
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530255#define PHY_SUSPEND_TIMEOUT_USEC (500 * 1000)
Pavankumar Kondeti70187732011-02-15 09:42:34 +0530256#define PHY_RESUME_TIMEOUT_USEC (100 * 1000)
257
258#ifdef CONFIG_PM_SLEEP
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530259static int msm_otg_suspend(struct msm_otg *motg)
260{
261 struct otg_transceiver *otg = &motg->otg;
262 struct usb_bus *bus = otg->host;
263 struct msm_otg_platform_data *pdata = motg->pdata;
264 int cnt = 0;
265
266 if (atomic_read(&motg->in_lpm))
267 return 0;
268
269 disable_irq(motg->irq);
270 /*
271 * Interrupt Latch Register auto-clear feature is not present
272 * in all PHY versions. Latch register is clear on read type.
273 * Clear latch register to avoid spurious wakeup from
274 * low power mode (LPM).
275 */
276 ulpi_read(otg, 0x14);
277
278 /*
279 * PHY comparators are disabled when PHY enters into low power
280 * mode (LPM). Keep PHY comparators ON in LPM only when we expect
281 * VBUS/Id notifications from USB PHY. Otherwise turn off USB
282 * PHY comparators. This save significant amount of power.
283 */
284 if (pdata->otg_control == OTG_PHY_CONTROL)
285 ulpi_write(otg, 0x01, 0x30);
286
287 /*
288 * PLL is not turned off when PHY enters into low power mode (LPM).
289 * Disable PLL for maximum power savings.
290 */
291 ulpi_write(otg, 0x08, 0x09);
292
293 /*
294 * PHY may take some time or even fail to enter into low power
295 * mode (LPM). Hence poll for 500 msec and reset the PHY and link
296 * in failure case.
297 */
298 writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC);
299 while (cnt < PHY_SUSPEND_TIMEOUT_USEC) {
300 if (readl(USB_PORTSC) & PORTSC_PHCD)
301 break;
302 udelay(1);
303 cnt++;
304 }
305
306 if (cnt >= PHY_SUSPEND_TIMEOUT_USEC) {
307 dev_err(otg->dev, "Unable to suspend PHY\n");
308 msm_otg_reset(otg);
309 enable_irq(motg->irq);
310 return -ETIMEDOUT;
311 }
312
313 /*
314 * PHY has capability to generate interrupt asynchronously in low
315 * power mode (LPM). This interrupt is level triggered. So USB IRQ
316 * line must be disabled till async interrupt enable bit is cleared
317 * in USBCMD register. Assert STP (ULPI interface STOP signal) to
318 * block data communication from PHY.
319 */
320 writel(readl(USB_USBCMD) | ASYNC_INTR_CTRL | ULPI_STP_CTRL, USB_USBCMD);
321
322 clk_disable(motg->pclk);
323 clk_disable(motg->clk);
324 if (motg->core_clk)
325 clk_disable(motg->core_clk);
326
Anji jonnala0f73cac82011-05-04 10:19:46 +0530327 if (!IS_ERR(motg->pclk_src))
328 clk_disable(motg->pclk_src);
329
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530330 if (device_may_wakeup(otg->dev))
331 enable_irq_wake(motg->irq);
332 if (bus)
333 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags);
334
335 atomic_set(&motg->in_lpm, 1);
336 enable_irq(motg->irq);
337
338 dev_info(otg->dev, "USB in low power mode\n");
339
340 return 0;
341}
342
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530343static int msm_otg_resume(struct msm_otg *motg)
344{
345 struct otg_transceiver *otg = &motg->otg;
346 struct usb_bus *bus = otg->host;
347 int cnt = 0;
348 unsigned temp;
349
350 if (!atomic_read(&motg->in_lpm))
351 return 0;
352
Anji jonnala0f73cac82011-05-04 10:19:46 +0530353 if (!IS_ERR(motg->pclk_src))
354 clk_enable(motg->pclk_src);
355
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530356 clk_enable(motg->pclk);
357 clk_enable(motg->clk);
358 if (motg->core_clk)
359 clk_enable(motg->core_clk);
360
361 temp = readl(USB_USBCMD);
362 temp &= ~ASYNC_INTR_CTRL;
363 temp &= ~ULPI_STP_CTRL;
364 writel(temp, USB_USBCMD);
365
366 /*
367 * PHY comes out of low power mode (LPM) in case of wakeup
368 * from asynchronous interrupt.
369 */
370 if (!(readl(USB_PORTSC) & PORTSC_PHCD))
371 goto skip_phy_resume;
372
373 writel(readl(USB_PORTSC) & ~PORTSC_PHCD, USB_PORTSC);
374 while (cnt < PHY_RESUME_TIMEOUT_USEC) {
375 if (!(readl(USB_PORTSC) & PORTSC_PHCD))
376 break;
377 udelay(1);
378 cnt++;
379 }
380
381 if (cnt >= PHY_RESUME_TIMEOUT_USEC) {
382 /*
383 * This is a fatal error. Reset the link and
384 * PHY. USB state can not be restored. Re-insertion
385 * of USB cable is the only way to get USB working.
386 */
387 dev_err(otg->dev, "Unable to resume USB."
388 "Re-plugin the cable\n");
389 msm_otg_reset(otg);
390 }
391
392skip_phy_resume:
393 if (device_may_wakeup(otg->dev))
394 disable_irq_wake(motg->irq);
395 if (bus)
396 set_bit(HCD_FLAG_HW_ACCESSIBLE, &(bus_to_hcd(bus))->flags);
397
Pavankumar Kondeti2ce2c3a2011-05-02 11:56:33 +0530398 atomic_set(&motg->in_lpm, 0);
399
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530400 if (motg->async_int) {
401 motg->async_int = 0;
402 pm_runtime_put(otg->dev);
403 enable_irq(motg->irq);
404 }
405
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530406 dev_info(otg->dev, "USB exited from low power mode\n");
407
408 return 0;
409}
Pavankumar Kondeti70187732011-02-15 09:42:34 +0530410#endif
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530411
Pavankumar Kondetid8608522011-05-04 10:19:47 +0530412static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA)
413{
414 if (motg->cur_power == mA)
415 return;
416
417 /* TODO: Notify PMIC about available current */
418 dev_info(motg->otg.dev, "Avail curr from USB = %u\n", mA);
419 motg->cur_power = mA;
420}
421
422static int msm_otg_set_power(struct otg_transceiver *otg, unsigned mA)
423{
424 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
425
426 /*
427 * Gadget driver uses set_power method to notify about the
428 * available current based on suspend/configured states.
429 *
430 * IDEV_CHG can be drawn irrespective of suspend/un-configured
431 * states when CDP/ACA is connected.
432 */
433 if (motg->chg_type == USB_SDP_CHARGER)
434 msm_otg_notify_charger(motg, mA);
435
436 return 0;
437}
438
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530439static void msm_otg_start_host(struct otg_transceiver *otg, int on)
440{
441 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
442 struct msm_otg_platform_data *pdata = motg->pdata;
443 struct usb_hcd *hcd;
444
445 if (!otg->host)
446 return;
447
448 hcd = bus_to_hcd(otg->host);
449
450 if (on) {
451 dev_dbg(otg->dev, "host on\n");
452
453 if (pdata->vbus_power)
454 pdata->vbus_power(1);
455 /*
456 * Some boards have a switch cotrolled by gpio
457 * to enable/disable internal HUB. Enable internal
458 * HUB before kicking the host.
459 */
460 if (pdata->setup_gpio)
461 pdata->setup_gpio(OTG_STATE_A_HOST);
462#ifdef CONFIG_USB
463 usb_add_hcd(hcd, hcd->irq, IRQF_SHARED);
464#endif
465 } else {
466 dev_dbg(otg->dev, "host off\n");
467
468#ifdef CONFIG_USB
469 usb_remove_hcd(hcd);
470#endif
471 if (pdata->setup_gpio)
472 pdata->setup_gpio(OTG_STATE_UNDEFINED);
473 if (pdata->vbus_power)
474 pdata->vbus_power(0);
475 }
476}
477
478static int msm_otg_set_host(struct otg_transceiver *otg, struct usb_bus *host)
479{
480 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
481 struct usb_hcd *hcd;
482
483 /*
484 * Fail host registration if this board can support
485 * only peripheral configuration.
486 */
487 if (motg->pdata->mode == USB_PERIPHERAL) {
488 dev_info(otg->dev, "Host mode is not supported\n");
489 return -ENODEV;
490 }
491
492 if (!host) {
493 if (otg->state == OTG_STATE_A_HOST) {
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530494 pm_runtime_get_sync(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530495 msm_otg_start_host(otg, 0);
496 otg->host = NULL;
497 otg->state = OTG_STATE_UNDEFINED;
498 schedule_work(&motg->sm_work);
499 } else {
500 otg->host = NULL;
501 }
502
503 return 0;
504 }
505
506 hcd = bus_to_hcd(host);
507 hcd->power_budget = motg->pdata->power_budget;
508
509 otg->host = host;
510 dev_dbg(otg->dev, "host driver registered w/ tranceiver\n");
511
512 /*
513 * Kick the state machine work, if peripheral is not supported
514 * or peripheral is already registered with us.
515 */
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530516 if (motg->pdata->mode == USB_HOST || otg->gadget) {
517 pm_runtime_get_sync(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530518 schedule_work(&motg->sm_work);
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530519 }
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530520
521 return 0;
522}
523
524static void msm_otg_start_peripheral(struct otg_transceiver *otg, int on)
525{
526 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
527 struct msm_otg_platform_data *pdata = motg->pdata;
528
529 if (!otg->gadget)
530 return;
531
532 if (on) {
533 dev_dbg(otg->dev, "gadget on\n");
534 /*
535 * Some boards have a switch cotrolled by gpio
536 * to enable/disable internal HUB. Disable internal
537 * HUB before kicking the gadget.
538 */
539 if (pdata->setup_gpio)
540 pdata->setup_gpio(OTG_STATE_B_PERIPHERAL);
541 usb_gadget_vbus_connect(otg->gadget);
542 } else {
543 dev_dbg(otg->dev, "gadget off\n");
544 usb_gadget_vbus_disconnect(otg->gadget);
545 if (pdata->setup_gpio)
546 pdata->setup_gpio(OTG_STATE_UNDEFINED);
547 }
548
549}
550
551static int msm_otg_set_peripheral(struct otg_transceiver *otg,
552 struct usb_gadget *gadget)
553{
554 struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
555
556 /*
557 * Fail peripheral registration if this board can support
558 * only host configuration.
559 */
560 if (motg->pdata->mode == USB_HOST) {
561 dev_info(otg->dev, "Peripheral mode is not supported\n");
562 return -ENODEV;
563 }
564
565 if (!gadget) {
566 if (otg->state == OTG_STATE_B_PERIPHERAL) {
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530567 pm_runtime_get_sync(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530568 msm_otg_start_peripheral(otg, 0);
569 otg->gadget = NULL;
570 otg->state = OTG_STATE_UNDEFINED;
571 schedule_work(&motg->sm_work);
572 } else {
573 otg->gadget = NULL;
574 }
575
576 return 0;
577 }
578 otg->gadget = gadget;
579 dev_dbg(otg->dev, "peripheral driver registered w/ tranceiver\n");
580
581 /*
582 * Kick the state machine work, if host is not supported
583 * or host is already registered with us.
584 */
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530585 if (motg->pdata->mode == USB_PERIPHERAL || otg->host) {
586 pm_runtime_get_sync(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530587 schedule_work(&motg->sm_work);
Pavankumar Kondeti87c01042010-12-07 17:53:58 +0530588 }
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530589
590 return 0;
591}
592
Pavankumar Kondetid8608522011-05-04 10:19:47 +0530593static bool msm_chg_check_secondary_det(struct msm_otg *motg)
594{
595 struct otg_transceiver *otg = &motg->otg;
596 u32 chg_det;
597 bool ret = false;
598
599 switch (motg->pdata->phy_type) {
600 case CI_45NM_INTEGRATED_PHY:
601 chg_det = ulpi_read(otg, 0x34);
602 ret = chg_det & (1 << 4);
603 break;
604 case SNPS_28NM_INTEGRATED_PHY:
605 chg_det = ulpi_read(otg, 0x87);
606 ret = chg_det & 1;
607 break;
608 default:
609 break;
610 }
611 return ret;
612}
613
614static void msm_chg_enable_secondary_det(struct msm_otg *motg)
615{
616 struct otg_transceiver *otg = &motg->otg;
617 u32 chg_det;
618
619 switch (motg->pdata->phy_type) {
620 case CI_45NM_INTEGRATED_PHY:
621 chg_det = ulpi_read(otg, 0x34);
622 /* Turn off charger block */
623 chg_det |= ~(1 << 1);
624 ulpi_write(otg, chg_det, 0x34);
625 udelay(20);
626 /* control chg block via ULPI */
627 chg_det &= ~(1 << 3);
628 ulpi_write(otg, chg_det, 0x34);
629 /* put it in host mode for enabling D- source */
630 chg_det &= ~(1 << 2);
631 ulpi_write(otg, chg_det, 0x34);
632 /* Turn on chg detect block */
633 chg_det &= ~(1 << 1);
634 ulpi_write(otg, chg_det, 0x34);
635 udelay(20);
636 /* enable chg detection */
637 chg_det &= ~(1 << 0);
638 ulpi_write(otg, chg_det, 0x34);
639 break;
640 case SNPS_28NM_INTEGRATED_PHY:
641 /*
642 * Configure DM as current source, DP as current sink
643 * and enable battery charging comparators.
644 */
645 ulpi_write(otg, 0x8, 0x85);
646 ulpi_write(otg, 0x2, 0x85);
647 ulpi_write(otg, 0x1, 0x85);
648 break;
649 default:
650 break;
651 }
652}
653
654static bool msm_chg_check_primary_det(struct msm_otg *motg)
655{
656 struct otg_transceiver *otg = &motg->otg;
657 u32 chg_det;
658 bool ret = false;
659
660 switch (motg->pdata->phy_type) {
661 case CI_45NM_INTEGRATED_PHY:
662 chg_det = ulpi_read(otg, 0x34);
663 ret = chg_det & (1 << 4);
664 break;
665 case SNPS_28NM_INTEGRATED_PHY:
666 chg_det = ulpi_read(otg, 0x87);
667 ret = chg_det & 1;
668 break;
669 default:
670 break;
671 }
672 return ret;
673}
674
675static void msm_chg_enable_primary_det(struct msm_otg *motg)
676{
677 struct otg_transceiver *otg = &motg->otg;
678 u32 chg_det;
679
680 switch (motg->pdata->phy_type) {
681 case CI_45NM_INTEGRATED_PHY:
682 chg_det = ulpi_read(otg, 0x34);
683 /* enable chg detection */
684 chg_det &= ~(1 << 0);
685 ulpi_write(otg, chg_det, 0x34);
686 break;
687 case SNPS_28NM_INTEGRATED_PHY:
688 /*
689 * Configure DP as current source, DM as current sink
690 * and enable battery charging comparators.
691 */
692 ulpi_write(otg, 0x2, 0x85);
693 ulpi_write(otg, 0x1, 0x85);
694 break;
695 default:
696 break;
697 }
698}
699
700static bool msm_chg_check_dcd(struct msm_otg *motg)
701{
702 struct otg_transceiver *otg = &motg->otg;
703 u32 line_state;
704 bool ret = false;
705
706 switch (motg->pdata->phy_type) {
707 case CI_45NM_INTEGRATED_PHY:
708 line_state = ulpi_read(otg, 0x15);
709 ret = !(line_state & 1);
710 break;
711 case SNPS_28NM_INTEGRATED_PHY:
712 line_state = ulpi_read(otg, 0x87);
713 ret = line_state & 2;
714 break;
715 default:
716 break;
717 }
718 return ret;
719}
720
721static void msm_chg_disable_dcd(struct msm_otg *motg)
722{
723 struct otg_transceiver *otg = &motg->otg;
724 u32 chg_det;
725
726 switch (motg->pdata->phy_type) {
727 case CI_45NM_INTEGRATED_PHY:
728 chg_det = ulpi_read(otg, 0x34);
729 chg_det &= ~(1 << 5);
730 ulpi_write(otg, chg_det, 0x34);
731 break;
732 case SNPS_28NM_INTEGRATED_PHY:
733 ulpi_write(otg, 0x10, 0x86);
734 break;
735 default:
736 break;
737 }
738}
739
740static void msm_chg_enable_dcd(struct msm_otg *motg)
741{
742 struct otg_transceiver *otg = &motg->otg;
743 u32 chg_det;
744
745 switch (motg->pdata->phy_type) {
746 case CI_45NM_INTEGRATED_PHY:
747 chg_det = ulpi_read(otg, 0x34);
748 /* Turn on D+ current source */
749 chg_det |= (1 << 5);
750 ulpi_write(otg, chg_det, 0x34);
751 break;
752 case SNPS_28NM_INTEGRATED_PHY:
753 /* Data contact detection enable */
754 ulpi_write(otg, 0x10, 0x85);
755 break;
756 default:
757 break;
758 }
759}
760
761static void msm_chg_block_on(struct msm_otg *motg)
762{
763 struct otg_transceiver *otg = &motg->otg;
764 u32 func_ctrl, chg_det;
765
766 /* put the controller in non-driving mode */
767 func_ctrl = ulpi_read(otg, ULPI_FUNC_CTRL);
768 func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
769 func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
770 ulpi_write(otg, func_ctrl, ULPI_FUNC_CTRL);
771
772 switch (motg->pdata->phy_type) {
773 case CI_45NM_INTEGRATED_PHY:
774 chg_det = ulpi_read(otg, 0x34);
775 /* control chg block via ULPI */
776 chg_det &= ~(1 << 3);
777 ulpi_write(otg, chg_det, 0x34);
778 /* Turn on chg detect block */
779 chg_det &= ~(1 << 1);
780 ulpi_write(otg, chg_det, 0x34);
781 udelay(20);
782 break;
783 case SNPS_28NM_INTEGRATED_PHY:
784 /* Clear charger detecting control bits */
785 ulpi_write(otg, 0x3F, 0x86);
786 /* Clear alt interrupt latch and enable bits */
787 ulpi_write(otg, 0x1F, 0x92);
788 ulpi_write(otg, 0x1F, 0x95);
789 udelay(100);
790 break;
791 default:
792 break;
793 }
794}
795
796static void msm_chg_block_off(struct msm_otg *motg)
797{
798 struct otg_transceiver *otg = &motg->otg;
799 u32 func_ctrl, chg_det;
800
801 switch (motg->pdata->phy_type) {
802 case CI_45NM_INTEGRATED_PHY:
803 chg_det = ulpi_read(otg, 0x34);
804 /* Turn off charger block */
805 chg_det |= ~(1 << 1);
806 ulpi_write(otg, chg_det, 0x34);
807 break;
808 case SNPS_28NM_INTEGRATED_PHY:
809 /* Clear charger detecting control bits */
810 ulpi_write(otg, 0x3F, 0x86);
811 /* Clear alt interrupt latch and enable bits */
812 ulpi_write(otg, 0x1F, 0x92);
813 ulpi_write(otg, 0x1F, 0x95);
814 break;
815 default:
816 break;
817 }
818
819 /* put the controller in normal mode */
820 func_ctrl = ulpi_read(otg, ULPI_FUNC_CTRL);
821 func_ctrl &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
822 func_ctrl |= ULPI_FUNC_CTRL_OPMODE_NORMAL;
823 ulpi_write(otg, func_ctrl, ULPI_FUNC_CTRL);
824}
825
826#define MSM_CHG_DCD_POLL_TIME (100 * HZ/1000) /* 100 msec */
827#define MSM_CHG_DCD_MAX_RETRIES 6 /* Tdcd_tmout = 6 * 100 msec */
828#define MSM_CHG_PRIMARY_DET_TIME (40 * HZ/1000) /* TVDPSRC_ON */
829#define MSM_CHG_SECONDARY_DET_TIME (40 * HZ/1000) /* TVDMSRC_ON */
830static void msm_chg_detect_work(struct work_struct *w)
831{
832 struct msm_otg *motg = container_of(w, struct msm_otg, chg_work.work);
833 struct otg_transceiver *otg = &motg->otg;
834 bool is_dcd, tmout, vout;
835 unsigned long delay;
836
837 dev_dbg(otg->dev, "chg detection work\n");
838 switch (motg->chg_state) {
839 case USB_CHG_STATE_UNDEFINED:
840 pm_runtime_get_sync(otg->dev);
841 msm_chg_block_on(motg);
842 msm_chg_enable_dcd(motg);
843 motg->chg_state = USB_CHG_STATE_WAIT_FOR_DCD;
844 motg->dcd_retries = 0;
845 delay = MSM_CHG_DCD_POLL_TIME;
846 break;
847 case USB_CHG_STATE_WAIT_FOR_DCD:
848 is_dcd = msm_chg_check_dcd(motg);
849 tmout = ++motg->dcd_retries == MSM_CHG_DCD_MAX_RETRIES;
850 if (is_dcd || tmout) {
851 msm_chg_disable_dcd(motg);
852 msm_chg_enable_primary_det(motg);
853 delay = MSM_CHG_PRIMARY_DET_TIME;
854 motg->chg_state = USB_CHG_STATE_DCD_DONE;
855 } else {
856 delay = MSM_CHG_DCD_POLL_TIME;
857 }
858 break;
859 case USB_CHG_STATE_DCD_DONE:
860 vout = msm_chg_check_primary_det(motg);
861 if (vout) {
862 msm_chg_enable_secondary_det(motg);
863 delay = MSM_CHG_SECONDARY_DET_TIME;
864 motg->chg_state = USB_CHG_STATE_PRIMARY_DONE;
865 } else {
866 motg->chg_type = USB_SDP_CHARGER;
867 motg->chg_state = USB_CHG_STATE_DETECTED;
868 delay = 0;
869 }
870 break;
871 case USB_CHG_STATE_PRIMARY_DONE:
872 vout = msm_chg_check_secondary_det(motg);
873 if (vout)
874 motg->chg_type = USB_DCP_CHARGER;
875 else
876 motg->chg_type = USB_CDP_CHARGER;
877 motg->chg_state = USB_CHG_STATE_SECONDARY_DONE;
878 /* fall through */
879 case USB_CHG_STATE_SECONDARY_DONE:
880 motg->chg_state = USB_CHG_STATE_DETECTED;
881 case USB_CHG_STATE_DETECTED:
882 msm_chg_block_off(motg);
883 dev_dbg(otg->dev, "charger = %d\n", motg->chg_type);
884 schedule_work(&motg->sm_work);
885 return;
886 default:
887 return;
888 }
889
890 schedule_delayed_work(&motg->chg_work, delay);
891}
892
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +0530893/*
894 * We support OTG, Peripheral only and Host only configurations. In case
895 * of OTG, mode switch (host-->peripheral/peripheral-->host) can happen
896 * via Id pin status or user request (debugfs). Id/BSV interrupts are not
897 * enabled when switch is controlled by user and default mode is supplied
898 * by board file, which can be changed by userspace later.
899 */
900static void msm_otg_init_sm(struct msm_otg *motg)
901{
902 struct msm_otg_platform_data *pdata = motg->pdata;
903 u32 otgsc = readl(USB_OTGSC);
904
905 switch (pdata->mode) {
906 case USB_OTG:
907 if (pdata->otg_control == OTG_PHY_CONTROL) {
908 if (otgsc & OTGSC_ID)
909 set_bit(ID, &motg->inputs);
910 else
911 clear_bit(ID, &motg->inputs);
912
913 if (otgsc & OTGSC_BSV)
914 set_bit(B_SESS_VLD, &motg->inputs);
915 else
916 clear_bit(B_SESS_VLD, &motg->inputs);
917 } else if (pdata->otg_control == OTG_USER_CONTROL) {
918 if (pdata->default_mode == USB_HOST) {
919 clear_bit(ID, &motg->inputs);
920 } else if (pdata->default_mode == USB_PERIPHERAL) {
921 set_bit(ID, &motg->inputs);
922 set_bit(B_SESS_VLD, &motg->inputs);
923 } else {
924 set_bit(ID, &motg->inputs);
925 clear_bit(B_SESS_VLD, &motg->inputs);
926 }
927 }
928 break;
929 case USB_HOST:
930 clear_bit(ID, &motg->inputs);
931 break;
932 case USB_PERIPHERAL:
933 set_bit(ID, &motg->inputs);
934 if (otgsc & OTGSC_BSV)
935 set_bit(B_SESS_VLD, &motg->inputs);
936 else
937 clear_bit(B_SESS_VLD, &motg->inputs);
938 break;
939 default:
940 break;
941 }
942}
943
944static void msm_otg_sm_work(struct work_struct *w)
945{
946 struct msm_otg *motg = container_of(w, struct msm_otg, sm_work);
947 struct otg_transceiver *otg = &motg->otg;
948
949 switch (otg->state) {
950 case OTG_STATE_UNDEFINED:
951 dev_dbg(otg->dev, "OTG_STATE_UNDEFINED state\n");
952 msm_otg_reset(otg);
953 msm_otg_init_sm(motg);
954 otg->state = OTG_STATE_B_IDLE;
955 /* FALL THROUGH */
956 case OTG_STATE_B_IDLE:
957 dev_dbg(otg->dev, "OTG_STATE_B_IDLE state\n");
958 if (!test_bit(ID, &motg->inputs) && otg->host) {
959 /* disable BSV bit */
960 writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
961 msm_otg_start_host(otg, 1);
962 otg->state = OTG_STATE_A_HOST;
Pavankumar Kondetid8608522011-05-04 10:19:47 +0530963 } else if (test_bit(B_SESS_VLD, &motg->inputs)) {
964 switch (motg->chg_state) {
965 case USB_CHG_STATE_UNDEFINED:
966 msm_chg_detect_work(&motg->chg_work.work);
967 break;
968 case USB_CHG_STATE_DETECTED:
969 switch (motg->chg_type) {
970 case USB_DCP_CHARGER:
971 msm_otg_notify_charger(motg,
972 IDEV_CHG_MAX);
973 break;
974 case USB_CDP_CHARGER:
975 msm_otg_notify_charger(motg,
976 IDEV_CHG_MAX);
977 msm_otg_start_peripheral(otg, 1);
978 otg->state = OTG_STATE_B_PERIPHERAL;
979 break;
980 case USB_SDP_CHARGER:
981 msm_otg_notify_charger(motg, IUNIT);
982 msm_otg_start_peripheral(otg, 1);
983 otg->state = OTG_STATE_B_PERIPHERAL;
984 break;
985 default:
986 break;
987 }
988 break;
989 default:
990 break;
991 }
992 } else {
993 /*
994 * If charger detection work is pending, decrement
995 * the pm usage counter to balance with the one that
996 * is incremented in charger detection work.
997 */
998 if (cancel_delayed_work_sync(&motg->chg_work)) {
999 pm_runtime_put_sync(otg->dev);
1000 msm_otg_reset(otg);
1001 }
1002 msm_otg_notify_charger(motg, 0);
1003 motg->chg_state = USB_CHG_STATE_UNDEFINED;
1004 motg->chg_type = USB_INVALID_CHARGER;
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301005 }
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301006 pm_runtime_put_sync(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301007 break;
1008 case OTG_STATE_B_PERIPHERAL:
1009 dev_dbg(otg->dev, "OTG_STATE_B_PERIPHERAL state\n");
1010 if (!test_bit(B_SESS_VLD, &motg->inputs) ||
1011 !test_bit(ID, &motg->inputs)) {
Pavankumar Kondetid8608522011-05-04 10:19:47 +05301012 msm_otg_notify_charger(motg, 0);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301013 msm_otg_start_peripheral(otg, 0);
Pavankumar Kondetid8608522011-05-04 10:19:47 +05301014 motg->chg_state = USB_CHG_STATE_UNDEFINED;
1015 motg->chg_type = USB_INVALID_CHARGER;
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301016 otg->state = OTG_STATE_B_IDLE;
1017 msm_otg_reset(otg);
1018 schedule_work(w);
1019 }
1020 break;
1021 case OTG_STATE_A_HOST:
1022 dev_dbg(otg->dev, "OTG_STATE_A_HOST state\n");
1023 if (test_bit(ID, &motg->inputs)) {
1024 msm_otg_start_host(otg, 0);
1025 otg->state = OTG_STATE_B_IDLE;
1026 msm_otg_reset(otg);
1027 schedule_work(w);
1028 }
1029 break;
1030 default:
1031 break;
1032 }
1033}
1034
1035static irqreturn_t msm_otg_irq(int irq, void *data)
1036{
1037 struct msm_otg *motg = data;
1038 struct otg_transceiver *otg = &motg->otg;
1039 u32 otgsc = 0;
1040
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301041 if (atomic_read(&motg->in_lpm)) {
1042 disable_irq_nosync(irq);
1043 motg->async_int = 1;
1044 pm_runtime_get(otg->dev);
1045 return IRQ_HANDLED;
1046 }
1047
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301048 otgsc = readl(USB_OTGSC);
1049 if (!(otgsc & (OTGSC_IDIS | OTGSC_BSVIS)))
1050 return IRQ_NONE;
1051
1052 if ((otgsc & OTGSC_IDIS) && (otgsc & OTGSC_IDIE)) {
1053 if (otgsc & OTGSC_ID)
1054 set_bit(ID, &motg->inputs);
1055 else
1056 clear_bit(ID, &motg->inputs);
1057 dev_dbg(otg->dev, "ID set/clear\n");
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301058 pm_runtime_get_noresume(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301059 } else if ((otgsc & OTGSC_BSVIS) && (otgsc & OTGSC_BSVIE)) {
1060 if (otgsc & OTGSC_BSV)
1061 set_bit(B_SESS_VLD, &motg->inputs);
1062 else
1063 clear_bit(B_SESS_VLD, &motg->inputs);
1064 dev_dbg(otg->dev, "BSV set/clear\n");
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301065 pm_runtime_get_noresume(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301066 }
1067
1068 writel(otgsc, USB_OTGSC);
1069 schedule_work(&motg->sm_work);
1070 return IRQ_HANDLED;
1071}
1072
1073static int msm_otg_mode_show(struct seq_file *s, void *unused)
1074{
1075 struct msm_otg *motg = s->private;
1076 struct otg_transceiver *otg = &motg->otg;
1077
1078 switch (otg->state) {
1079 case OTG_STATE_A_HOST:
1080 seq_printf(s, "host\n");
1081 break;
1082 case OTG_STATE_B_PERIPHERAL:
1083 seq_printf(s, "peripheral\n");
1084 break;
1085 default:
1086 seq_printf(s, "none\n");
1087 break;
1088 }
1089
1090 return 0;
1091}
1092
1093static int msm_otg_mode_open(struct inode *inode, struct file *file)
1094{
1095 return single_open(file, msm_otg_mode_show, inode->i_private);
1096}
1097
1098static ssize_t msm_otg_mode_write(struct file *file, const char __user *ubuf,
1099 size_t count, loff_t *ppos)
1100{
Pavankumar Kondetie2904ee2011-02-15 09:42:35 +05301101 struct seq_file *s = file->private_data;
1102 struct msm_otg *motg = s->private;
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301103 char buf[16];
1104 struct otg_transceiver *otg = &motg->otg;
1105 int status = count;
1106 enum usb_mode_type req_mode;
1107
1108 memset(buf, 0x00, sizeof(buf));
1109
1110 if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) {
1111 status = -EFAULT;
1112 goto out;
1113 }
1114
1115 if (!strncmp(buf, "host", 4)) {
1116 req_mode = USB_HOST;
1117 } else if (!strncmp(buf, "peripheral", 10)) {
1118 req_mode = USB_PERIPHERAL;
1119 } else if (!strncmp(buf, "none", 4)) {
1120 req_mode = USB_NONE;
1121 } else {
1122 status = -EINVAL;
1123 goto out;
1124 }
1125
1126 switch (req_mode) {
1127 case USB_NONE:
1128 switch (otg->state) {
1129 case OTG_STATE_A_HOST:
1130 case OTG_STATE_B_PERIPHERAL:
1131 set_bit(ID, &motg->inputs);
1132 clear_bit(B_SESS_VLD, &motg->inputs);
1133 break;
1134 default:
1135 goto out;
1136 }
1137 break;
1138 case USB_PERIPHERAL:
1139 switch (otg->state) {
1140 case OTG_STATE_B_IDLE:
1141 case OTG_STATE_A_HOST:
1142 set_bit(ID, &motg->inputs);
1143 set_bit(B_SESS_VLD, &motg->inputs);
1144 break;
1145 default:
1146 goto out;
1147 }
1148 break;
1149 case USB_HOST:
1150 switch (otg->state) {
1151 case OTG_STATE_B_IDLE:
1152 case OTG_STATE_B_PERIPHERAL:
1153 clear_bit(ID, &motg->inputs);
1154 break;
1155 default:
1156 goto out;
1157 }
1158 break;
1159 default:
1160 goto out;
1161 }
1162
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301163 pm_runtime_get_sync(otg->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301164 schedule_work(&motg->sm_work);
1165out:
1166 return status;
1167}
1168
1169const struct file_operations msm_otg_mode_fops = {
1170 .open = msm_otg_mode_open,
1171 .read = seq_read,
1172 .write = msm_otg_mode_write,
1173 .llseek = seq_lseek,
1174 .release = single_release,
1175};
1176
1177static struct dentry *msm_otg_dbg_root;
1178static struct dentry *msm_otg_dbg_mode;
1179
1180static int msm_otg_debugfs_init(struct msm_otg *motg)
1181{
1182 msm_otg_dbg_root = debugfs_create_dir("msm_otg", NULL);
1183
1184 if (!msm_otg_dbg_root || IS_ERR(msm_otg_dbg_root))
1185 return -ENODEV;
1186
1187 msm_otg_dbg_mode = debugfs_create_file("mode", S_IRUGO | S_IWUSR,
1188 msm_otg_dbg_root, motg, &msm_otg_mode_fops);
1189 if (!msm_otg_dbg_mode) {
1190 debugfs_remove(msm_otg_dbg_root);
1191 msm_otg_dbg_root = NULL;
1192 return -ENODEV;
1193 }
1194
1195 return 0;
1196}
1197
1198static void msm_otg_debugfs_cleanup(void)
1199{
1200 debugfs_remove(msm_otg_dbg_mode);
1201 debugfs_remove(msm_otg_dbg_root);
1202}
1203
1204static int __init msm_otg_probe(struct platform_device *pdev)
1205{
1206 int ret = 0;
1207 struct resource *res;
1208 struct msm_otg *motg;
1209 struct otg_transceiver *otg;
1210
1211 dev_info(&pdev->dev, "msm_otg probe\n");
1212 if (!pdev->dev.platform_data) {
1213 dev_err(&pdev->dev, "No platform data given. Bailing out\n");
1214 return -ENODEV;
1215 }
1216
1217 motg = kzalloc(sizeof(struct msm_otg), GFP_KERNEL);
1218 if (!motg) {
1219 dev_err(&pdev->dev, "unable to allocate msm_otg\n");
1220 return -ENOMEM;
1221 }
1222
1223 motg->pdata = pdev->dev.platform_data;
1224 otg = &motg->otg;
1225 otg->dev = &pdev->dev;
1226
1227 motg->phy_reset_clk = clk_get(&pdev->dev, "usb_phy_clk");
1228 if (IS_ERR(motg->phy_reset_clk)) {
1229 dev_err(&pdev->dev, "failed to get usb_phy_clk\n");
1230 ret = PTR_ERR(motg->phy_reset_clk);
1231 goto free_motg;
1232 }
1233
1234 motg->clk = clk_get(&pdev->dev, "usb_hs_clk");
1235 if (IS_ERR(motg->clk)) {
1236 dev_err(&pdev->dev, "failed to get usb_hs_clk\n");
1237 ret = PTR_ERR(motg->clk);
1238 goto put_phy_reset_clk;
1239 }
Anji jonnala0f73cac82011-05-04 10:19:46 +05301240 clk_set_rate(motg->clk, 60000000);
1241
1242 /*
1243 * If USB Core is running its protocol engine based on CORE CLK,
1244 * CORE CLK must be running at >55Mhz for correct HSUSB
1245 * operation and USB core cannot tolerate frequency changes on
1246 * CORE CLK. For such USB cores, vote for maximum clk frequency
1247 * on pclk source
1248 */
1249 if (motg->pdata->pclk_src_name) {
1250 motg->pclk_src = clk_get(&pdev->dev,
1251 motg->pdata->pclk_src_name);
1252 if (IS_ERR(motg->pclk_src))
1253 goto put_clk;
1254 clk_set_rate(motg->pclk_src, INT_MAX);
1255 clk_enable(motg->pclk_src);
1256 } else
1257 motg->pclk_src = ERR_PTR(-ENOENT);
1258
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301259
1260 motg->pclk = clk_get(&pdev->dev, "usb_hs_pclk");
1261 if (IS_ERR(motg->pclk)) {
1262 dev_err(&pdev->dev, "failed to get usb_hs_pclk\n");
1263 ret = PTR_ERR(motg->pclk);
Anji jonnala0f73cac82011-05-04 10:19:46 +05301264 goto put_pclk_src;
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301265 }
1266
1267 /*
1268 * USB core clock is not present on all MSM chips. This
1269 * clock is introduced to remove the dependency on AXI
1270 * bus frequency.
1271 */
1272 motg->core_clk = clk_get(&pdev->dev, "usb_hs_core_clk");
1273 if (IS_ERR(motg->core_clk))
1274 motg->core_clk = NULL;
1275
1276 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1277 if (!res) {
1278 dev_err(&pdev->dev, "failed to get platform resource mem\n");
1279 ret = -ENODEV;
1280 goto put_core_clk;
1281 }
1282
1283 motg->regs = ioremap(res->start, resource_size(res));
1284 if (!motg->regs) {
1285 dev_err(&pdev->dev, "ioremap failed\n");
1286 ret = -ENOMEM;
1287 goto put_core_clk;
1288 }
1289 dev_info(&pdev->dev, "OTG regs = %p\n", motg->regs);
1290
1291 motg->irq = platform_get_irq(pdev, 0);
1292 if (!motg->irq) {
1293 dev_err(&pdev->dev, "platform_get_irq failed\n");
1294 ret = -ENODEV;
1295 goto free_regs;
1296 }
1297
1298 clk_enable(motg->clk);
1299 clk_enable(motg->pclk);
1300 if (motg->core_clk)
1301 clk_enable(motg->core_clk);
1302
1303 writel(0, USB_USBINTR);
1304 writel(0, USB_OTGSC);
1305
1306 INIT_WORK(&motg->sm_work, msm_otg_sm_work);
Pavankumar Kondetid8608522011-05-04 10:19:47 +05301307 INIT_DELAYED_WORK(&motg->chg_work, msm_chg_detect_work);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301308 ret = request_irq(motg->irq, msm_otg_irq, IRQF_SHARED,
1309 "msm_otg", motg);
1310 if (ret) {
1311 dev_err(&pdev->dev, "request irq failed\n");
1312 goto disable_clks;
1313 }
1314
1315 otg->init = msm_otg_reset;
1316 otg->set_host = msm_otg_set_host;
1317 otg->set_peripheral = msm_otg_set_peripheral;
Pavankumar Kondetid8608522011-05-04 10:19:47 +05301318 otg->set_power = msm_otg_set_power;
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301319
1320 otg->io_ops = &msm_otg_io_ops;
1321
1322 ret = otg_set_transceiver(&motg->otg);
1323 if (ret) {
1324 dev_err(&pdev->dev, "otg_set_transceiver failed\n");
1325 goto free_irq;
1326 }
1327
1328 platform_set_drvdata(pdev, motg);
1329 device_init_wakeup(&pdev->dev, 1);
1330
1331 if (motg->pdata->mode == USB_OTG &&
1332 motg->pdata->otg_control == OTG_USER_CONTROL) {
1333 ret = msm_otg_debugfs_init(motg);
1334 if (ret)
1335 dev_dbg(&pdev->dev, "mode debugfs file is"
1336 "not available\n");
1337 }
1338
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301339 pm_runtime_set_active(&pdev->dev);
1340 pm_runtime_enable(&pdev->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301341
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301342 return 0;
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301343free_irq:
1344 free_irq(motg->irq, motg);
1345disable_clks:
1346 clk_disable(motg->pclk);
1347 clk_disable(motg->clk);
1348free_regs:
1349 iounmap(motg->regs);
1350put_core_clk:
1351 if (motg->core_clk)
1352 clk_put(motg->core_clk);
1353 clk_put(motg->pclk);
Anji jonnala0f73cac82011-05-04 10:19:46 +05301354put_pclk_src:
1355 if (!IS_ERR(motg->pclk_src)) {
1356 clk_disable(motg->pclk_src);
1357 clk_put(motg->pclk_src);
1358 }
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301359put_clk:
1360 clk_put(motg->clk);
1361put_phy_reset_clk:
1362 clk_put(motg->phy_reset_clk);
1363free_motg:
1364 kfree(motg);
1365 return ret;
1366}
1367
1368static int __devexit msm_otg_remove(struct platform_device *pdev)
1369{
1370 struct msm_otg *motg = platform_get_drvdata(pdev);
1371 struct otg_transceiver *otg = &motg->otg;
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301372 int cnt = 0;
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301373
1374 if (otg->host || otg->gadget)
1375 return -EBUSY;
1376
1377 msm_otg_debugfs_cleanup();
Pavankumar Kondetid8608522011-05-04 10:19:47 +05301378 cancel_delayed_work_sync(&motg->chg_work);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301379 cancel_work_sync(&motg->sm_work);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301380
Pavankumar Kondeti70187732011-02-15 09:42:34 +05301381 pm_runtime_resume(&pdev->dev);
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301382
1383 device_init_wakeup(&pdev->dev, 0);
1384 pm_runtime_disable(&pdev->dev);
1385
1386 otg_set_transceiver(NULL);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301387 free_irq(motg->irq, motg);
1388
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301389 /*
1390 * Put PHY in low power mode.
1391 */
1392 ulpi_read(otg, 0x14);
1393 ulpi_write(otg, 0x08, 0x09);
1394
1395 writel(readl(USB_PORTSC) | PORTSC_PHCD, USB_PORTSC);
1396 while (cnt < PHY_SUSPEND_TIMEOUT_USEC) {
1397 if (readl(USB_PORTSC) & PORTSC_PHCD)
1398 break;
1399 udelay(1);
1400 cnt++;
1401 }
1402 if (cnt >= PHY_SUSPEND_TIMEOUT_USEC)
1403 dev_err(otg->dev, "Unable to suspend PHY\n");
1404
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301405 clk_disable(motg->pclk);
1406 clk_disable(motg->clk);
1407 if (motg->core_clk)
1408 clk_disable(motg->core_clk);
Anji jonnala0f73cac82011-05-04 10:19:46 +05301409 if (!IS_ERR(motg->pclk_src)) {
1410 clk_disable(motg->pclk_src);
1411 clk_put(motg->pclk_src);
1412 }
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301413
1414 iounmap(motg->regs);
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301415 pm_runtime_set_suspended(&pdev->dev);
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301416
1417 clk_put(motg->phy_reset_clk);
1418 clk_put(motg->pclk);
1419 clk_put(motg->clk);
1420 if (motg->core_clk)
1421 clk_put(motg->core_clk);
1422
1423 kfree(motg);
1424
1425 return 0;
1426}
1427
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301428#ifdef CONFIG_PM_RUNTIME
1429static int msm_otg_runtime_idle(struct device *dev)
1430{
1431 struct msm_otg *motg = dev_get_drvdata(dev);
1432 struct otg_transceiver *otg = &motg->otg;
1433
1434 dev_dbg(dev, "OTG runtime idle\n");
1435
1436 /*
1437 * It is observed some times that a spurious interrupt
1438 * comes when PHY is put into LPM immediately after PHY reset.
1439 * This 1 sec delay also prevents entering into LPM immediately
1440 * after asynchronous interrupt.
1441 */
1442 if (otg->state != OTG_STATE_UNDEFINED)
1443 pm_schedule_suspend(dev, 1000);
1444
1445 return -EAGAIN;
1446}
1447
1448static int msm_otg_runtime_suspend(struct device *dev)
1449{
1450 struct msm_otg *motg = dev_get_drvdata(dev);
1451
1452 dev_dbg(dev, "OTG runtime suspend\n");
1453 return msm_otg_suspend(motg);
1454}
1455
1456static int msm_otg_runtime_resume(struct device *dev)
1457{
1458 struct msm_otg *motg = dev_get_drvdata(dev);
1459
1460 dev_dbg(dev, "OTG runtime resume\n");
1461 return msm_otg_resume(motg);
1462}
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301463#endif
1464
Pavankumar Kondeti70187732011-02-15 09:42:34 +05301465#ifdef CONFIG_PM_SLEEP
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301466static int msm_otg_pm_suspend(struct device *dev)
1467{
1468 struct msm_otg *motg = dev_get_drvdata(dev);
1469
1470 dev_dbg(dev, "OTG PM suspend\n");
1471 return msm_otg_suspend(motg);
1472}
1473
1474static int msm_otg_pm_resume(struct device *dev)
1475{
1476 struct msm_otg *motg = dev_get_drvdata(dev);
1477 int ret;
1478
1479 dev_dbg(dev, "OTG PM resume\n");
1480
1481 ret = msm_otg_resume(motg);
1482 if (ret)
1483 return ret;
1484
1485 /*
1486 * Runtime PM Documentation recommends bringing the
1487 * device to full powered state upon resume.
1488 */
1489 pm_runtime_disable(dev);
1490 pm_runtime_set_active(dev);
1491 pm_runtime_enable(dev);
1492
1493 return 0;
1494}
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301495#endif
1496
Pavankumar Kondeti70187732011-02-15 09:42:34 +05301497#ifdef CONFIG_PM
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301498static const struct dev_pm_ops msm_otg_dev_pm_ops = {
Pavankumar Kondeti70187732011-02-15 09:42:34 +05301499 SET_SYSTEM_SLEEP_PM_OPS(msm_otg_pm_suspend, msm_otg_pm_resume)
1500 SET_RUNTIME_PM_OPS(msm_otg_runtime_suspend, msm_otg_runtime_resume,
1501 msm_otg_runtime_idle)
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301502};
Pavankumar Kondeti70187732011-02-15 09:42:34 +05301503#endif
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301504
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301505static struct platform_driver msm_otg_driver = {
1506 .remove = __devexit_p(msm_otg_remove),
1507 .driver = {
1508 .name = DRIVER_NAME,
1509 .owner = THIS_MODULE,
Pavankumar Kondeti70187732011-02-15 09:42:34 +05301510#ifdef CONFIG_PM
Pavankumar Kondeti87c01042010-12-07 17:53:58 +05301511 .pm = &msm_otg_dev_pm_ops,
Pavankumar Kondeti70187732011-02-15 09:42:34 +05301512#endif
Pavankumar Kondetie0c201f2010-12-07 17:53:55 +05301513 },
1514};
1515
1516static int __init msm_otg_init(void)
1517{
1518 return platform_driver_probe(&msm_otg_driver, msm_otg_probe);
1519}
1520
1521static void __exit msm_otg_exit(void)
1522{
1523 platform_driver_unregister(&msm_otg_driver);
1524}
1525
1526module_init(msm_otg_init);
1527module_exit(msm_otg_exit);
1528
1529MODULE_LICENSE("GPL v2");
1530MODULE_DESCRIPTION("MSM USB transceiver driver");