blob: 0ee1827388fe1b950b609affc23d8cfbc4e87bbe [file] [log] [blame]
Manu Gautam5143b252012-01-05 19:25:23 -08001/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
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 */
13
14#include <linux/module.h>
15#include <linux/device.h>
16#include <linux/platform_device.h>
17#include <linux/clk.h>
18#include <linux/interrupt.h>
19#include <linux/err.h>
20#include <linux/delay.h>
21#include <linux/io.h>
22#include <linux/ioport.h>
23#include <linux/pm_runtime.h>
24
25#include <linux/device.h>
26#include <linux/pm_qos_params.h>
27#include <mach/msm_hsusb_hw.h>
28#include <mach/msm72k_otg.h>
29#include <mach/msm_hsusb.h>
30#include <linux/debugfs.h>
31#include <linux/uaccess.h>
32#include <mach/clk.h>
33#include <mach/msm_xo.h>
34
35#define MSM_USB_BASE (dev->regs)
36#define USB_LINK_RESET_TIMEOUT (msecs_to_jiffies(10))
37#define DRIVER_NAME "msm_otg"
38static void otg_reset(struct otg_transceiver *xceiv, int phy_reset);
39static void msm_otg_set_vbus_state(int online);
Anji jonnalaae745e92011-11-14 18:34:31 +053040#ifdef CONFIG_USB_EHCI_MSM_72K
41static void msm_otg_set_id_state(int id);
42#else
43static void msm_otg_set_id_state(int id)
44{
45}
46#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070047
48struct msm_otg *the_msm_otg;
49
50static int is_host(void)
51{
52 struct msm_otg *dev = the_msm_otg;
53
Anji jonnalaae745e92011-11-14 18:34:31 +053054 if (dev->pdata->otg_mode == OTG_ID)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070055 return (OTGSC_ID & readl(USB_OTGSC)) ? 0 : 1;
56 else
57 return !test_bit(ID, &dev->inputs);
58}
59
60static int is_b_sess_vld(void)
61{
62 struct msm_otg *dev = the_msm_otg;
63
64 if (dev->pdata->otg_mode == OTG_ID)
65 return (OTGSC_BSV & readl(USB_OTGSC)) ? 1 : 0;
66 else
67 return test_bit(B_SESS_VLD, &dev->inputs);
68}
69
70static unsigned ulpi_read(struct msm_otg *dev, unsigned reg)
71{
72 unsigned ret, timeout = 100000;
73 unsigned long flags;
74
75 spin_lock_irqsave(&dev->lock, flags);
76
77 /* initiate read operation */
78 writel(ULPI_RUN | ULPI_READ | ULPI_ADDR(reg),
79 USB_ULPI_VIEWPORT);
80
81 /* wait for completion */
82 while ((readl(USB_ULPI_VIEWPORT) & ULPI_RUN) && (--timeout))
83 cpu_relax();
84
85 if (timeout == 0) {
86 pr_err("%s: timeout %08x\n", __func__,
87 readl(USB_ULPI_VIEWPORT));
88 spin_unlock_irqrestore(&dev->lock, flags);
89 return 0xffffffff;
90 }
91 ret = ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT));
92
93 spin_unlock_irqrestore(&dev->lock, flags);
94
95 return ret;
96}
97
98static int ulpi_write(struct msm_otg *dev, unsigned val, unsigned reg)
99{
100 unsigned timeout = 10000;
101 unsigned long flags;
102
103 spin_lock_irqsave(&dev->lock, flags);
104
105 /* initiate write operation */
106 writel(ULPI_RUN | ULPI_WRITE |
107 ULPI_ADDR(reg) | ULPI_DATA(val),
108 USB_ULPI_VIEWPORT);
109
110 /* wait for completion */
111 while ((readl(USB_ULPI_VIEWPORT) & ULPI_RUN) && (--timeout))
112 ;
113
114 if (timeout == 0) {
115 pr_err("%s: timeout\n", __func__);
116 spin_unlock_irqrestore(&dev->lock, flags);
117 return -1;
118 }
119
120 spin_unlock_irqrestore(&dev->lock, flags);
121
122 return 0;
123}
124
125static int usb_ulpi_write(struct otg_transceiver *xceiv, u32 val, u32 reg)
126{
127 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
128
129 return ulpi_write(dev, val, reg);
130}
131
132static int usb_ulpi_read(struct otg_transceiver *xceiv, u32 reg)
133{
134 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
135
136 return ulpi_read(dev, reg);
137}
138
139#ifdef CONFIG_USB_EHCI_MSM_72K
140static void enable_idgnd(struct msm_otg *dev)
141{
Anji jonnalaae745e92011-11-14 18:34:31 +0530142 unsigned temp;
143
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700144 /* Do nothing if instead of ID pin, USER controls mode switch */
145 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
146 return;
147
148 ulpi_write(dev, (1<<4), 0x0E);
149 ulpi_write(dev, (1<<4), 0x11);
Anji jonnalaae745e92011-11-14 18:34:31 +0530150 ulpi_write(dev, (1<<0), 0x0B);
151 temp = OTGSC_IDIE | OTGSC_IDPU;
152 writel_relaxed(readl_relaxed(USB_OTGSC) | temp, USB_OTGSC);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700153}
154
155static void disable_idgnd(struct msm_otg *dev)
156{
Anji jonnalaae745e92011-11-14 18:34:31 +0530157 unsigned temp;
158
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700159 /* Do nothing if instead of ID pin, USER controls mode switch */
160 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
161 return;
Anji jonnalaae745e92011-11-14 18:34:31 +0530162 temp = OTGSC_IDIE | OTGSC_IDPU;
163 writel_relaxed(readl_relaxed(USB_OTGSC) & ~temp, USB_OTGSC);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700164 ulpi_write(dev, (1<<4), 0x0F);
165 ulpi_write(dev, (1<<4), 0x12);
Anji jonnalaae745e92011-11-14 18:34:31 +0530166 ulpi_write(dev, (1<<0), 0x0C);
167}
168#else
169static void enable_idgnd(struct msm_otg *dev)
170{
171}
172static void disable_idgnd(struct msm_otg *dev)
173{
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700174}
175#endif
176
177static void enable_idabc(struct msm_otg *dev)
178{
179#ifdef CONFIG_USB_MSM_ACA
180 ulpi_write(dev, (1<<5), 0x0E);
181 ulpi_write(dev, (1<<5), 0x11);
182#endif
183}
184static void disable_idabc(struct msm_otg *dev)
185{
186#ifdef CONFIG_USB_MSM_ACA
187 ulpi_write(dev, (1<<5), 0x0F);
188 ulpi_write(dev, (1<<5), 0x12);
189#endif
190}
191
192static void enable_sess_valid(struct msm_otg *dev)
193{
194 /* Do nothing if instead of ID pin, USER controls mode switch */
195 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
196 return;
197
198 ulpi_write(dev, (1<<2), 0x0E);
199 ulpi_write(dev, (1<<2), 0x11);
200 writel(readl(USB_OTGSC) | OTGSC_BSVIE, USB_OTGSC);
201}
202
203static void disable_sess_valid(struct msm_otg *dev)
204{
205 /* Do nothing if instead of ID pin, USER controls mode switch */
206 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
207 return;
208
209 ulpi_write(dev, (1<<2), 0x0F);
210 ulpi_write(dev, (1<<2), 0x12);
211 writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
212}
213#ifdef CONFIG_USB_MSM_ACA
214static void set_aca_id_inputs(struct msm_otg *dev)
215{
216 u8 phy_ints;
217
218 phy_ints = ulpi_read(dev, 0x13);
219 if (phy_ints == -ETIMEDOUT)
220 return;
221
222 pr_debug("phy_ints = %x\n", phy_ints);
223 clear_bit(ID_A, &dev->inputs);
224 clear_bit(ID_B, &dev->inputs);
225 clear_bit(ID_C, &dev->inputs);
226 if (phy_id_state_a(phy_ints)) {
227 pr_debug("ID_A set\n");
228 set_bit(ID_A, &dev->inputs);
229 set_bit(A_BUS_REQ, &dev->inputs);
230 } else if (phy_id_state_b(phy_ints)) {
231 pr_debug("ID_B set\n");
232 set_bit(ID_B, &dev->inputs);
233 } else if (phy_id_state_c(phy_ints)) {
234 pr_debug("ID_C set\n");
235 set_bit(ID_C, &dev->inputs);
236 }
237 if (is_b_sess_vld())
238 set_bit(B_SESS_VLD, &dev->inputs);
239 else
240 clear_bit(B_SESS_VLD, &dev->inputs);
241}
242#define get_aca_bmaxpower(dev) (dev->b_max_power)
243#define set_aca_bmaxpower(dev, power) (dev->b_max_power = power)
244#else
Anji jonnalaae745e92011-11-14 18:34:31 +0530245static void set_aca_id_inputs(struct msm_otg *dev)
246{
247}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700248#define get_aca_bmaxpower(dev) 0
249#define set_aca_bmaxpower(dev, power)
250#endif
251static inline void set_pre_emphasis_level(struct msm_otg *dev)
252{
253 unsigned res = 0;
254
255 if (!dev->pdata || dev->pdata->pemp_level == PRE_EMPHASIS_DEFAULT)
256 return;
257
258 res = ulpi_read(dev, ULPI_CONFIG_REG3);
259 res &= ~(ULPI_PRE_EMPHASIS_MASK);
260 if (dev->pdata->pemp_level != PRE_EMPHASIS_DISABLE)
261 res |= dev->pdata->pemp_level;
262 ulpi_write(dev, res, ULPI_CONFIG_REG3);
263}
264
265static inline void set_hsdrv_slope(struct msm_otg *dev)
266{
267 unsigned res = 0;
268
269 if (!dev->pdata || dev->pdata->hsdrvslope == HS_DRV_SLOPE_DEFAULT)
270 return;
271
272 res = ulpi_read(dev, ULPI_CONFIG_REG3);
273 res &= ~(ULPI_HSDRVSLOPE_MASK);
274 res |= (dev->pdata->hsdrvslope & ULPI_HSDRVSLOPE_MASK);
275 ulpi_write(dev, res, ULPI_CONFIG_REG3);
276}
277
278static inline void set_cdr_auto_reset(struct msm_otg *dev)
279{
280 unsigned res = 0;
281
282 if (!dev->pdata || dev->pdata->cdr_autoreset == CDR_AUTO_RESET_DEFAULT)
283 return;
284
285 res = ulpi_read(dev, ULPI_DIGOUT_CTRL);
286 if (dev->pdata->cdr_autoreset == CDR_AUTO_RESET_ENABLE)
287 res &= ~ULPI_CDR_AUTORESET;
288 else
289 res |= ULPI_CDR_AUTORESET;
290 ulpi_write(dev, res, ULPI_DIGOUT_CTRL);
291}
292
293static inline void set_se1_gating(struct msm_otg *dev)
294{
295 unsigned res = 0;
296
297 if (!dev->pdata || dev->pdata->se1_gating == SE1_GATING_DEFAULT)
298 return;
299
300 res = ulpi_read(dev, ULPI_DIGOUT_CTRL);
301 if (dev->pdata->se1_gating == SE1_GATING_ENABLE)
302 res &= ~ULPI_SE1_GATE;
303 else
304 res |= ULPI_SE1_GATE;
305 ulpi_write(dev, res, ULPI_DIGOUT_CTRL);
306}
307static inline void set_driver_amplitude(struct msm_otg *dev)
308{
309 unsigned res = 0;
310
311 if (!dev->pdata || dev->pdata->drv_ampl == HS_DRV_AMPLITUDE_DEFAULT)
312 return;
313
314 res = ulpi_read(dev, ULPI_CONFIG_REG2);
315 res &= ~ULPI_DRV_AMPL_MASK;
316 if (dev->pdata->drv_ampl != HS_DRV_AMPLITUDE_ZERO_PERCENT)
317 res |= dev->pdata->drv_ampl;
318 ulpi_write(dev, res, ULPI_CONFIG_REG2);
319}
320
321static const char *state_string(enum usb_otg_state state)
322{
323 switch (state) {
324 case OTG_STATE_A_IDLE: return "a_idle";
325 case OTG_STATE_A_WAIT_VRISE: return "a_wait_vrise";
326 case OTG_STATE_A_WAIT_BCON: return "a_wait_bcon";
327 case OTG_STATE_A_HOST: return "a_host";
328 case OTG_STATE_A_SUSPEND: return "a_suspend";
329 case OTG_STATE_A_PERIPHERAL: return "a_peripheral";
330 case OTG_STATE_A_WAIT_VFALL: return "a_wait_vfall";
331 case OTG_STATE_A_VBUS_ERR: return "a_vbus_err";
332 case OTG_STATE_B_IDLE: return "b_idle";
333 case OTG_STATE_B_SRP_INIT: return "b_srp_init";
334 case OTG_STATE_B_PERIPHERAL: return "b_peripheral";
335 case OTG_STATE_B_WAIT_ACON: return "b_wait_acon";
336 case OTG_STATE_B_HOST: return "b_host";
337 default: return "UNDEFINED";
338 }
339}
340
341static const char *timer_string(int bit)
342{
343 switch (bit) {
344 case A_WAIT_VRISE: return "a_wait_vrise";
345 case A_WAIT_VFALL: return "a_wait_vfall";
346 case B_SRP_FAIL: return "b_srp_fail";
347 case A_WAIT_BCON: return "a_wait_bcon";
348 case A_AIDL_BDIS: return "a_aidl_bdis";
349 case A_BIDL_ADIS: return "a_bidl_adis";
350 case B_ASE0_BRST: return "b_ase0_brst";
351 default: return "UNDEFINED";
352 }
353}
354
355/* Prevent idle power collapse(pc) while operating in peripheral mode */
356static void otg_pm_qos_update_latency(struct msm_otg *dev, int vote)
357{
358 struct msm_otg_platform_data *pdata = dev->pdata;
359 u32 swfi_latency = 0;
360
361 if (pdata)
362 swfi_latency = pdata->swfi_latency + 1;
363
364 if (vote)
365 pm_qos_update_request(&pdata->pm_qos_req_dma,
366 swfi_latency);
367 else
368 pm_qos_update_request(&pdata->pm_qos_req_dma,
369 PM_QOS_DEFAULT_VALUE);
370}
371
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700372/* Controller gives interrupt for every 1 mesc if 1MSIE is set in OTGSC.
373 * This interrupt can be used as a timer source and OTG timers can be
374 * implemented. But hrtimers on MSM hardware can give atleast 1/32 KHZ
375 * precision. This precision is more than enough for OTG timers.
376 */
377static enum hrtimer_restart msm_otg_timer_func(struct hrtimer *_timer)
378{
379 struct msm_otg *dev = container_of(_timer, struct msm_otg, timer);
380
381 /* Phy lockup issues are observed when VBUS Valid interrupt is
382 * enabled. Hence set A_VBUS_VLD upon timer exipration.
383 */
384 if (dev->active_tmout == A_WAIT_VRISE)
385 set_bit(A_VBUS_VLD, &dev->inputs);
386 else
387 set_bit(dev->active_tmout, &dev->tmouts);
388
389 pr_debug("expired %s timer\n", timer_string(dev->active_tmout));
390 queue_work(dev->wq, &dev->sm_work);
391 return HRTIMER_NORESTART;
392}
393
394static void msm_otg_del_timer(struct msm_otg *dev)
395{
396 int bit = dev->active_tmout;
397
398 pr_debug("deleting %s timer. remaining %lld msec \n", timer_string(bit),
399 div_s64(ktime_to_us(hrtimer_get_remaining(&dev->timer)),
400 1000));
401 hrtimer_cancel(&dev->timer);
402 clear_bit(bit, &dev->tmouts);
403}
404
405static void msm_otg_start_timer(struct msm_otg *dev, int time, int bit)
406{
407 clear_bit(bit, &dev->tmouts);
408 dev->active_tmout = bit;
409 pr_debug("starting %s timer\n", timer_string(bit));
410 hrtimer_start(&dev->timer,
411 ktime_set(time / 1000, (time % 1000) * 1000000),
412 HRTIMER_MODE_REL);
413}
414
415/* No two otg timers run in parallel. So one hrtimer is sufficient */
416static void msm_otg_init_timer(struct msm_otg *dev)
417{
418 hrtimer_init(&dev->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
419 dev->timer.function = msm_otg_timer_func;
420}
421
422static const char *event_string(enum usb_otg_event event)
423{
424 switch (event) {
425 case OTG_EVENT_DEV_CONN_TMOUT:
426 return "DEV_CONN_TMOUT";
427 case OTG_EVENT_NO_RESP_FOR_HNP_ENABLE:
428 return "NO_RESP_FOR_HNP_ENABLE";
429 case OTG_EVENT_HUB_NOT_SUPPORTED:
430 return "HUB_NOT_SUPPORTED";
431 case OTG_EVENT_DEV_NOT_SUPPORTED:
432 return "DEV_NOT_SUPPORTED,";
433 case OTG_EVENT_HNP_FAILED:
434 return "HNP_FAILED";
435 case OTG_EVENT_NO_RESP_FOR_SRP:
436 return "NO_RESP_FOR_SRP";
437 default:
438 return "UNDEFINED";
439 }
440}
441
442static int msm_otg_send_event(struct otg_transceiver *xceiv,
443 enum usb_otg_event event)
444{
445 char module_name[16];
446 char udev_event[128];
447 char *envp[] = { module_name, udev_event, NULL };
448 int ret;
449
450 pr_debug("sending %s event\n", event_string(event));
451
452 snprintf(module_name, 16, "MODULE=%s", DRIVER_NAME);
453 snprintf(udev_event, 128, "EVENT=%s", event_string(event));
454 ret = kobject_uevent_env(&xceiv->dev->kobj, KOBJ_CHANGE, envp);
455 if (ret < 0)
456 pr_info("uevent sending failed with ret = %d\n", ret);
457 return ret;
458}
459
460static int msm_otg_start_hnp(struct otg_transceiver *xceiv)
461{
462 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
463 enum usb_otg_state state;
464 unsigned long flags;
465
466 spin_lock_irqsave(&dev->lock, flags);
467 state = dev->otg.state;
468 spin_unlock_irqrestore(&dev->lock, flags);
469
470 if (state != OTG_STATE_A_HOST) {
471 pr_err("HNP can not be initiated in %s state\n",
472 state_string(state));
473 return -EINVAL;
474 }
475
476 pr_debug("A-Host: HNP initiated\n");
477 clear_bit(A_BUS_REQ, &dev->inputs);
478 wake_lock(&dev->wlock);
479 queue_work(dev->wq, &dev->sm_work);
480 return 0;
481}
482
483static int msm_otg_start_srp(struct otg_transceiver *xceiv)
484{
485 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
486 u32 val;
487 int ret = 0;
488 enum usb_otg_state state;
489 unsigned long flags;
490
491 spin_lock_irqsave(&dev->lock, flags);
492 state = dev->otg.state;
493 spin_unlock_irqrestore(&dev->lock, flags);
494
495 if (state != OTG_STATE_B_IDLE) {
496 pr_err("SRP can not be initiated in %s state\n",
497 state_string(state));
498 ret = -EINVAL;
499 goto out;
500 }
501
502 if ((jiffies - dev->b_last_se0_sess) < msecs_to_jiffies(TB_SRP_INIT)) {
503 pr_debug("initial conditions of SRP are not met. Try again"
504 "after some time\n");
505 ret = -EAGAIN;
506 goto out;
507 }
508
509 /* Harware auto assist data pulsing: Data pulse is given
510 * for 7msec; wait for vbus
511 */
512 val = readl(USB_OTGSC);
513 writel((val & ~OTGSC_INTR_STS_MASK) | OTGSC_HADP, USB_OTGSC);
514
515 /* VBUS plusing is obsoleted in OTG 2.0 supplement */
516out:
517 return ret;
518}
519
520static int msm_otg_set_power(struct otg_transceiver *xceiv, unsigned mA)
521{
522 static enum chg_type curr_chg = USB_CHG_TYPE__INVALID;
523 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
524 struct msm_otg_platform_data *pdata = dev->pdata;
525 enum chg_type new_chg = atomic_read(&dev->chg_type);
526 unsigned charge = mA;
527
528 /* Call chg_connected only if the charger has changed */
529 if (new_chg != curr_chg && pdata->chg_connected) {
530 curr_chg = new_chg;
531 pdata->chg_connected(new_chg);
532 }
533
534 /* Always use USB_IDCHG_MAX for charging in ID_B and ID_C */
535 if (test_bit(ID_C, &dev->inputs) ||
536 test_bit(ID_B, &dev->inputs))
537 charge = USB_IDCHG_MAX;
538
539 pr_debug("Charging with %dmA current\n", charge);
540 /* Call vbus_draw only if the charger is of known type and also
541 * ignore request to stop charging as a result of suspend interrupt
542 * when wall-charger is used.
543 */
544 if (pdata->chg_vbus_draw && new_chg != USB_CHG_TYPE__INVALID &&
545 (charge || new_chg != USB_CHG_TYPE__WALLCHARGER))
546 pdata->chg_vbus_draw(charge);
547
548 if (new_chg == USB_CHG_TYPE__WALLCHARGER) {
549 wake_lock(&dev->wlock);
550 queue_work(dev->wq, &dev->sm_work);
551 }
552
553 return 0;
554}
555
556static int msm_otg_set_clk(struct otg_transceiver *xceiv, int on)
557{
558 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
559
560 if (!dev || (dev != the_msm_otg))
561 return -ENODEV;
562
563 if (on)
564 /* enable clocks */
Manu Gautam28b1bac2012-01-30 16:43:06 +0530565 clk_prepare_enable(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700566 else
Manu Gautam28b1bac2012-01-30 16:43:06 +0530567 clk_disable_unprepare(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700568
569 return 0;
570}
571static void msm_otg_start_peripheral(struct otg_transceiver *xceiv, int on)
572{
573 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
574 struct msm_otg_platform_data *pdata = dev->pdata;
575
576 if (!xceiv->gadget)
577 return;
578
579 if (on) {
580 if (pdata->setup_gpio)
581 pdata->setup_gpio(USB_SWITCH_PERIPHERAL);
582 /* vote for minimum dma_latency to prevent idle
583 * power collapse(pc) while running in peripheral mode.
584 */
585 otg_pm_qos_update_latency(dev, 1);
586
587 /* increment the clk reference count so that
588 * it would be still on when disabled from
589 * low power mode routine
590 */
591 if (dev->pdata->pclk_required_during_lpm)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530592 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700593
594 usb_gadget_vbus_connect(xceiv->gadget);
595 } else {
596 atomic_set(&dev->chg_type, USB_CHG_TYPE__INVALID);
597 usb_gadget_vbus_disconnect(xceiv->gadget);
598
599 /* decrement the clk reference count so that
600 * it would be off when disabled from
601 * low power mode routine
602 */
603 if (dev->pdata->pclk_required_during_lpm)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530604 clk_disable_unprepare(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700605
606 otg_pm_qos_update_latency(dev, 0);
607 if (pdata->setup_gpio)
608 pdata->setup_gpio(USB_SWITCH_DISABLE);
609 }
610}
611
612static void msm_otg_start_host(struct otg_transceiver *xceiv, int on)
613{
614 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
615 struct msm_otg_platform_data *pdata = dev->pdata;
616
617 if (!xceiv->host)
618 return;
619
620 if (dev->start_host) {
621 /* Some targets, e.g. ST1.5, use GPIO to choose b/w connector */
622 if (on && pdata->setup_gpio)
623 pdata->setup_gpio(USB_SWITCH_HOST);
624
625 /* increment or decrement the clk reference count
626 * to avoid usb h/w lockup issues when low power
627 * mode is initiated and vbus is on.
628 */
629 if (dev->pdata->pclk_required_during_lpm) {
630 if (on)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530631 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700632 else
Manu Gautam28b1bac2012-01-30 16:43:06 +0530633 clk_disable_unprepare(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700634 }
635
636 dev->start_host(xceiv->host, on);
637
638 if (!on && pdata->setup_gpio)
639 pdata->setup_gpio(USB_SWITCH_DISABLE);
640 }
641}
642
643static int msm_otg_suspend(struct msm_otg *dev)
644{
645 unsigned long timeout;
646 bool host_bus_suspend;
647 unsigned ret;
648 enum chg_type chg_type = atomic_read(&dev->chg_type);
649 unsigned long flags;
650
651 disable_irq(dev->irq);
652 if (atomic_read(&dev->in_lpm))
653 goto out;
654#ifdef CONFIG_USB_MSM_ACA
655 /*
656 * ACA interrupts are disabled before entering into LPM.
657 * If LPM is allowed in host mode with accessory charger
658 * connected or only accessory charger is connected,
659 * there is a chance that charger is removed and we will
660 * not know about it.
661 *
662 * REVISIT
663 *
664 * Allowing LPM in case of gadget bus suspend is tricky.
665 * Bus suspend can happen in two states.
666 * 1. ID_float: Allowing LPM has pros and cons. If LPM is allowed
667 * and accessory charger is connected, we miss ID_float --> ID_C
668 * transition where we could draw large amount of current
669 * compared to the suspend current.
670 * 2. ID_C: We can not allow LPM. If accessory charger is removed
671 * we should not draw more than what host could supply which will
672 * be less compared to accessory charger.
673 *
674 * For simplicity, LPM is not allowed in bus suspend.
675 */
676#ifndef CONFIG_USB_MSM_STANDARD_ACA
677 /*
678 * RID_A and IdGnd states are only possible with standard ACA. We can
679 * exit from low power mode with !BSV or IdGnd interrupt. Hence LPM
680 * is allowed.
681 */
682 if ((test_bit(ID, &dev->inputs) && test_bit(B_SESS_VLD, &dev->inputs) &&
683 chg_type != USB_CHG_TYPE__WALLCHARGER) ||
684 test_bit(ID_A, &dev->inputs))
685 goto out;
686#endif
687 /* Disable ID_abc interrupts else it causes spurious interrupt */
688 disable_idabc(dev);
689#endif
690 ulpi_read(dev, 0x14);/* clear PHY interrupt latch register */
691
692 /*
693 * Turn on PHY comparators if,
694 * 1. USB wall charger is connected (bus suspend is not supported)
695 * 2. Host bus suspend
696 * 3. host is supported, but, id is not routed to pmic
697 * 4. peripheral is supported, but, vbus is not routed to pmic
698 */
699 host_bus_suspend = dev->otg.host && is_host();
Anji jonnalaae745e92011-11-14 18:34:31 +0530700
701 /*
702 * Configure the PMIC ID only in case of cable disconnect.
703 * PMIC doesn't generate interrupt for ID_GND to ID_A
704 * transistion. hence use the PHY ID cricuit.
705 */
706 if (dev->pdata->pmic_id_notif_init && !host_bus_suspend &&
707 !test_bit(ID_A, &dev->inputs)) {
708 disable_idgnd(dev);
709 ret = dev->pdata->pmic_id_notif_init(
710 &msm_otg_set_id_state, 1);
711 if (!ret) {
712 dev->pmic_id_notif_supp = 1;
713 if (dev->pdata->pmic_id_irq)
714 dev->id_irq = dev->pdata->pmic_id_irq;
715 } else if (ret == -ENOTSUPP) {
716 pr_debug("%s:USB ID is not routed to pmic",
717 __func__);
718 enable_idgnd(dev);
719 } else {
720 pr_err("%s: pmic_id_ notif_init failed err:%d",
721 __func__, ret);
722 }
723 }
724
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700725 if ((dev->otg.gadget && chg_type == USB_CHG_TYPE__WALLCHARGER) ||
726 host_bus_suspend ||
727 (dev->otg.host && !dev->pmic_id_notif_supp) ||
728 (dev->otg.gadget && !dev->pmic_vbus_notif_supp)) {
729 ulpi_write(dev, 0x01, 0x30);
730 }
731
732 ulpi_write(dev, 0x08, 0x09);/* turn off PLL on integrated phy */
733
734 timeout = jiffies + msecs_to_jiffies(500);
735 disable_phy_clk();
736 while (!is_phy_clk_disabled()) {
737 if (time_after(jiffies, timeout)) {
738 pr_err("%s: Unable to suspend phy\n", __func__);
739 /*
740 * Start otg state machine in default state upon
741 * phy suspend failure*/
742 spin_lock_irqsave(&dev->lock, flags);
743 dev->otg.state = OTG_STATE_UNDEFINED;
744 spin_unlock_irqrestore(&dev->lock, flags);
745 queue_work(dev->wq, &dev->sm_work);
746 goto out;
747 }
748 msleep(1);
749 /* check if there are any pending interrupts*/
750 if (((readl(USB_OTGSC) & OTGSC_INTR_MASK) >> 8) &
751 readl(USB_OTGSC)) {
752 enable_idabc(dev);
753 goto out;
754 }
755 }
756
757 writel(readl(USB_USBCMD) | ASYNC_INTR_CTRL | ULPI_STP_CTRL, USB_USBCMD);
758 /* Ensure that above operation is completed before turning off clocks */
759 mb();
760
Manu Gautam5143b252012-01-05 19:25:23 -0800761 if (dev->iface_clk)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530762 clk_disable_unprepare(dev->iface_clk);
Manu Gautam5143b252012-01-05 19:25:23 -0800763
Manu Gautam28b1bac2012-01-30 16:43:06 +0530764 clk_disable_unprepare(dev->core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700765 /* usb phy no more require TCXO clock, hence vote for TCXO disable*/
766 ret = msm_xo_mode_vote(dev->xo_handle, MSM_XO_MODE_OFF);
767 if (ret)
768 pr_err("%s failed to devote for"
769 "TCXO D1 buffer%d\n", __func__, ret);
770
771 if (device_may_wakeup(dev->otg.dev)) {
772 enable_irq_wake(dev->irq);
773 if (dev->vbus_on_irq)
774 enable_irq_wake(dev->vbus_on_irq);
Anji jonnalaeb9e60d2011-10-05 12:19:46 +0530775 if (dev->id_irq)
776 enable_irq_wake(dev->id_irq);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700777 }
778
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700779 atomic_set(&dev->in_lpm, 1);
780
Anji jonnala3498c472011-11-04 13:30:14 +0530781 /*
782 * TODO: put regulators in low power mode by assuming that
783 * regulators are brought back to active state before PHY
784 * becomes active. But this assumption becomes wrong in case of
785 * ACA charger where PHY itself will generate the wakeup
786 * interrupt. This creates a small window where PHY regulators
787 * are in LPM but PHY is in active state and this patch assumes
788 * that there is no harm with this. Till hw folks confirms this
789 * put regulators in lpm.
790 */
Anji jonnalaae745e92011-11-14 18:34:31 +0530791 if (!host_bus_suspend && dev->pmic_vbus_notif_supp &&
792 !test_bit(ID_A, &dev->inputs)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700793 pr_debug("phy can power collapse: (%d)\n",
794 can_phy_power_collapse(dev));
795 if (can_phy_power_collapse(dev) && dev->pdata->ldo_enable) {
796 pr_debug("disabling the regulators\n");
797 dev->pdata->ldo_enable(0);
798 }
799 }
800
801 /* phy can interrupts when vddcx is at 0.75, so irrespective
802 * of pmic notification support, configure vddcx @0.75
803 */
804 if (dev->pdata->config_vddcx)
805 dev->pdata->config_vddcx(0);
806 pr_info("%s: usb in low power mode\n", __func__);
807
808out:
809 enable_irq(dev->irq);
810
811 return 0;
812}
813
814static int msm_otg_resume(struct msm_otg *dev)
815{
816 unsigned temp;
817 unsigned ret;
818
819 if (!atomic_read(&dev->in_lpm))
820 return 0;
821 /* vote for vddcx, as PHY cannot tolerate vddcx below 1.0V */
822 if (dev->pdata->config_vddcx) {
823 ret = dev->pdata->config_vddcx(1);
824 if (ret) {
825 pr_err("%s: unable to enable vddcx digital core:%d\n",
826 __func__, ret);
827 }
828 }
829 if (dev->pdata->ldo_set_voltage)
830 dev->pdata->ldo_set_voltage(3400);
831
832 /* Vote for TCXO when waking up the phy */
833 ret = msm_xo_mode_vote(dev->xo_handle, MSM_XO_MODE_ON);
834 if (ret)
835 pr_err("%s failed to vote for"
836 "TCXO D1 buffer%d\n", __func__, ret);
837
Manu Gautam28b1bac2012-01-30 16:43:06 +0530838 clk_prepare_enable(dev->core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700839
Manu Gautam5143b252012-01-05 19:25:23 -0800840 if (dev->iface_clk)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530841 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700842
843 temp = readl(USB_USBCMD);
844 temp &= ~ASYNC_INTR_CTRL;
845 temp &= ~ULPI_STP_CTRL;
846 writel(temp, USB_USBCMD);
847
848 if (device_may_wakeup(dev->otg.dev)) {
849 disable_irq_wake(dev->irq);
850 if (dev->vbus_on_irq)
851 disable_irq_wake(dev->vbus_on_irq);
Anji jonnalaeb9e60d2011-10-05 12:19:46 +0530852 if (dev->id_irq)
853 disable_irq_wake(dev->id_irq);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700854 }
855
856 atomic_set(&dev->in_lpm, 0);
857
858 pr_info("%s: usb exited from low power mode\n", __func__);
859
860 return 0;
861}
862
863static void msm_otg_get_resume(struct msm_otg *dev)
864{
865#ifdef CONFIG_PM_RUNTIME
866 pm_runtime_get_noresume(dev->otg.dev);
867 pm_runtime_resume(dev->otg.dev);
868#else
869 msm_otg_resume(dev);
870#endif
871}
872
873static void msm_otg_put_suspend(struct msm_otg *dev)
874{
875#ifdef CONFIG_PM_RUNTIME
876 pm_runtime_put_sync(dev->otg.dev);
Pavankumar Kondetidc60f122011-09-13 11:17:16 +0530877 if (!atomic_read(&dev->in_lpm))
878 pm_runtime_get_sync(dev->otg.dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700879#else
880 msm_otg_suspend(dev);
881#endif
882}
883
884static void msm_otg_resume_w(struct work_struct *w)
885{
886 struct msm_otg *dev = container_of(w, struct msm_otg, otg_resume_work);
887 unsigned long timeout;
888
Anji jonnala3498c472011-11-04 13:30:14 +0530889 if (can_phy_power_collapse(dev) && dev->pdata->ldo_enable)
890 dev->pdata->ldo_enable(1);
891
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700892 msm_otg_get_resume(dev);
893
894 if (!is_phy_clk_disabled())
895 goto phy_resumed;
896
897 timeout = jiffies + usecs_to_jiffies(100);
898 enable_phy_clk();
899 while (is_phy_clk_disabled() || !is_phy_active()) {
900 if (time_after(jiffies, timeout)) {
901 pr_err("%s: Unable to wakeup phy. is_phy_active: %x\n",
902 __func__, !!is_phy_active());
903 /* Reset both phy and link */
904 otg_reset(&dev->otg, 1);
905 break;
906 }
907 udelay(10);
908 }
909
910phy_resumed:
Anji jonnalaae745e92011-11-14 18:34:31 +0530911 /*
912 * It is observed that BSVIS may get set immediatly
913 * after PHY becomes active upon micro-B cable connect.
914 * But BSVIS might get cleared by below enable_idgnd
915 * function which causes hw to not generate the BSV interrupt.
916 * Hence check for BSV interrupt explictly and schedule the
917 * work.
918 */
919 if (readl_relaxed(USB_OTGSC) & OTGSC_BSVIS) {
920 set_bit(B_SESS_VLD, &dev->inputs);
921 queue_work(dev->wq, &dev->sm_work);
922 }
923 if (dev->pmic_id_notif_supp) {
924 dev->pdata->pmic_id_notif_init(&msm_otg_set_id_state, 0);
925 dev->pmic_id_notif_supp = 0;
926 enable_idgnd(dev);
927 }
928
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700929 /* Enable Idabc interrupts as these were disabled before entering LPM */
930 enable_idabc(dev);
931
Anji jonnalaae745e92011-11-14 18:34:31 +0530932 /*
933 * There is corner case where host won't be resumed
934 * while transitioning from ID_GND to ID_A. In that
935 * IDGND might have cleared and ID_A might not have updated
936 * yet. Hence update the ACA states explicitly.
937 */
938 set_aca_id_inputs(dev);
939
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700940 /* If resume signalling finishes before lpm exit, PCD is not set in
941 * USBSTS register. Drive resume signal to the downstream device now
942 * so that host driver can process the upcoming port change interrupt.*/
943 if (is_host() || test_bit(ID_A, &dev->inputs)) {
944 writel(readl(USB_PORTSC) | PORTSC_FPR, USB_PORTSC);
945 msm_otg_start_host(&dev->otg, REQUEST_RESUME);
946 }
947
948 /* Enable irq which was disabled before scheduling this work.
949 * But don't release wake_lock, as we got async interrupt and
950 * there will be some work pending for OTG state machine.
951 */
952 enable_irq(dev->irq);
953}
954
955static int msm_otg_set_suspend(struct otg_transceiver *xceiv, int suspend)
956{
957 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
958 enum usb_otg_state state;
959 unsigned long flags;
960
961 if (!dev || (dev != the_msm_otg))
962 return -ENODEV;
963
964 spin_lock_irqsave(&dev->lock, flags);
965 state = dev->otg.state;
966 spin_unlock_irqrestore(&dev->lock, flags);
967
968 pr_debug("suspend request in state: %s\n",
969 state_string(state));
970
971 if (suspend) {
972 switch (state) {
973#ifndef CONFIG_MSM_OTG_ENABLE_A_WAIT_BCON_TIMEOUT
974 case OTG_STATE_A_WAIT_BCON:
975 if (test_bit(ID_A, &dev->inputs))
976 msm_otg_set_power(xceiv, USB_IDCHG_MIN - 100);
977 msm_otg_put_suspend(dev);
978 break;
979#endif
980 case OTG_STATE_A_HOST:
981 clear_bit(A_BUS_REQ, &dev->inputs);
982 wake_lock(&dev->wlock);
983 queue_work(dev->wq, &dev->sm_work);
984 break;
985 case OTG_STATE_B_PERIPHERAL:
986 if (xceiv->gadget->b_hnp_enable) {
987 set_bit(A_BUS_SUSPEND, &dev->inputs);
988 set_bit(B_BUS_REQ, &dev->inputs);
989 wake_lock(&dev->wlock);
990 queue_work(dev->wq, &dev->sm_work);
991 }
992 break;
993 case OTG_STATE_A_PERIPHERAL:
994 msm_otg_start_timer(dev, TA_BIDL_ADIS,
995 A_BIDL_ADIS);
996 break;
997 default:
998 break;
999 }
1000 } else {
1001 unsigned long timeout;
1002
1003 switch (state) {
1004 case OTG_STATE_A_PERIPHERAL:
1005 /* A-peripheral observed activity on bus.
1006 * clear A_BIDL_ADIS timer.
1007 */
1008 msm_otg_del_timer(dev);
1009 break;
1010 case OTG_STATE_A_SUSPEND:
1011 /* Remote wakeup or resume */
1012 set_bit(A_BUS_REQ, &dev->inputs);
1013 spin_lock_irqsave(&dev->lock, flags);
1014 dev->otg.state = OTG_STATE_A_HOST;
1015 spin_unlock_irqrestore(&dev->lock, flags);
1016 if (test_bit(ID_A, &dev->inputs) &&
1017 (get_aca_bmaxpower(dev) < USB_IDCHG_MIN))
1018 msm_otg_set_power(xceiv,
1019 USB_IDCHG_MIN - get_aca_bmaxpower(dev));
1020 break;
1021 default:
1022 break;
1023 }
1024
1025 if (suspend == atomic_read(&dev->in_lpm))
1026 return 0;
1027
1028 disable_irq(dev->irq);
1029 if (dev->pmic_vbus_notif_supp)
1030 if (can_phy_power_collapse(dev) &&
1031 dev->pdata->ldo_enable)
1032 dev->pdata->ldo_enable(1);
1033
1034 msm_otg_get_resume(dev);
1035
1036 if (!is_phy_clk_disabled())
1037 goto out;
1038
1039 timeout = jiffies + usecs_to_jiffies(100);
1040 enable_phy_clk();
1041 while (is_phy_clk_disabled() || !is_phy_active()) {
1042 if (time_after(jiffies, timeout)) {
1043 pr_err("%s: Unable to wakeup phy. "
1044 "is_phy_active: %x\n",
1045 __func__, !!is_phy_active());
1046 /* Reset both phy and link */
1047 otg_reset(&dev->otg, 1);
1048 break;
1049 }
1050 udelay(10);
1051 }
Anji jonnalaae745e92011-11-14 18:34:31 +05301052 if (dev->pmic_id_notif_supp) {
1053 dev->pdata->pmic_id_notif_init(
1054 &msm_otg_set_id_state, 0);
1055 dev->pmic_id_notif_supp = 0;
1056 enable_idgnd(dev);
1057 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001058out:
1059 enable_idabc(dev);
1060 enable_irq(dev->irq);
1061
1062 }
1063
1064 return 0;
1065}
1066
1067static int msm_otg_set_peripheral(struct otg_transceiver *xceiv,
1068 struct usb_gadget *gadget)
1069{
1070 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
1071
1072 if (!dev || (dev != the_msm_otg))
1073 return -ENODEV;
1074
1075 if (!gadget) {
1076 msm_otg_start_peripheral(xceiv, 0);
1077 dev->otg.gadget = 0;
1078 disable_sess_valid(dev);
1079 if (!dev->otg.host)
1080 disable_idabc(dev);
1081 return 0;
1082 }
1083 dev->otg.gadget = gadget;
1084 pr_info("peripheral driver registered w/ tranceiver\n");
1085
1086 wake_lock(&dev->wlock);
1087 queue_work(dev->wq, &dev->sm_work);
1088 return 0;
1089}
1090
1091#ifdef CONFIG_USB_EHCI_MSM_72K
1092static int usbdev_notify(struct notifier_block *self,
1093 unsigned long action, void *device)
1094{
1095 enum usb_otg_state state;
1096 struct msm_otg *dev = container_of(self, struct msm_otg, usbdev_nb);
1097 struct usb_device *udev = device;
1098 int work = 1;
1099 unsigned long flags;
1100
1101 /* Interested in only devices directly connected
1102 * to root hub directly.
1103 */
1104 if (!udev->parent || udev->parent->parent)
1105 goto out;
1106
1107 spin_lock_irqsave(&dev->lock, flags);
1108 state = dev->otg.state;
1109 spin_unlock_irqrestore(&dev->lock, flags);
1110
1111 switch (state) {
1112 case OTG_STATE_A_WAIT_BCON:
1113 if (action == USB_DEVICE_ADD) {
1114 pr_debug("B_CONN set\n");
1115 set_bit(B_CONN, &dev->inputs);
1116 if (udev->actconfig) {
1117 set_aca_bmaxpower(dev,
1118 udev->actconfig->desc.bMaxPower * 2);
1119 goto do_work;
1120 }
1121 if (udev->portnum == udev->bus->otg_port)
1122 set_aca_bmaxpower(dev, USB_IB_UNCFG);
1123 else
1124 set_aca_bmaxpower(dev, 100);
1125 }
1126 break;
1127 case OTG_STATE_A_HOST:
1128 if (action == USB_DEVICE_REMOVE) {
1129 pr_debug("B_CONN clear\n");
1130 clear_bit(B_CONN, &dev->inputs);
1131 set_aca_bmaxpower(dev, 0);
1132 }
1133 break;
1134 default:
1135 work = 0;
1136 break;
1137 }
1138do_work:
1139 if (work) {
1140 wake_lock(&dev->wlock);
1141 queue_work(dev->wq, &dev->sm_work);
1142 }
1143out:
1144 return NOTIFY_OK;
1145}
1146
1147static int msm_otg_set_host(struct otg_transceiver *xceiv, struct usb_bus *host)
1148{
1149 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
1150
1151 if (!dev || (dev != the_msm_otg))
1152 return -ENODEV;
1153
1154 if (!dev->start_host)
1155 return -ENODEV;
1156
1157 if (!host) {
1158 msm_otg_start_host(xceiv, REQUEST_STOP);
1159 usb_unregister_notify(&dev->usbdev_nb);
1160 dev->otg.host = 0;
1161 dev->start_host = 0;
1162 disable_idgnd(dev);
1163 if (!dev->otg.gadget)
1164 disable_idabc(dev);
1165 return 0;
1166 }
1167#ifdef CONFIG_USB_OTG
1168 host->otg_port = 1;
1169#endif
1170 dev->usbdev_nb.notifier_call = usbdev_notify;
1171 usb_register_notify(&dev->usbdev_nb);
1172 dev->otg.host = host;
1173 pr_info("host driver registered w/ tranceiver\n");
1174
1175#ifndef CONFIG_USB_MSM_72K
1176 wake_lock(&dev->wlock);
1177 queue_work(dev->wq, &dev->sm_work);
1178#endif
1179 return 0;
1180}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001181
Anji jonnalaae745e92011-11-14 18:34:31 +05301182static void msm_otg_set_id_state(int id)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001183{
1184 struct msm_otg *dev = the_msm_otg;
1185 unsigned long flags;
1186
Anji jonnalaae745e92011-11-14 18:34:31 +05301187 if (!atomic_read(&dev->in_lpm))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001188 return;
1189
1190 if (id) {
1191 set_bit(ID, &dev->inputs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001192 } else {
1193 clear_bit(ID, &dev->inputs);
1194 set_bit(A_BUS_REQ, &dev->inputs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001195 }
1196 spin_lock_irqsave(&dev->lock, flags);
1197 if (dev->otg.state != OTG_STATE_UNDEFINED) {
1198 wake_lock(&dev->wlock);
1199 queue_work(dev->wq, &dev->sm_work);
1200 }
1201 spin_unlock_irqrestore(&dev->lock, flags);
1202}
Anji jonnalaae745e92011-11-14 18:34:31 +05301203#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001204
1205void msm_otg_set_vbus_state(int online)
1206{
1207 struct msm_otg *dev = the_msm_otg;
1208
Rajkumar Raghupathyf5c6c602011-11-25 16:20:42 +05301209 /*
1210 * Process disconnect only for wallcharger
1211 * during fast plug-out plug-in at the
1212 * AC source side.
1213 */
1214 if (online)
1215 set_bit(B_SESS_VLD, &dev->inputs);
1216 else
1217 clear_bit(B_SESS_VLD, &dev->inputs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001218
1219 wake_lock(&dev->wlock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001220 queue_work(dev->wq, &dev->sm_work);
1221}
1222
1223static irqreturn_t msm_otg_irq(int irq, void *data)
1224{
1225 struct msm_otg *dev = data;
1226 u32 otgsc, sts, pc, sts_mask;
1227 irqreturn_t ret = IRQ_HANDLED;
1228 int work = 0;
1229 enum usb_otg_state state;
1230 unsigned long flags;
1231
1232 if (atomic_read(&dev->in_lpm)) {
1233 disable_irq_nosync(dev->irq);
1234 wake_lock(&dev->wlock);
1235 queue_work(dev->wq, &dev->otg_resume_work);
1236 goto out;
1237 }
1238
1239 /* Return immediately if instead of ID pin, USER controls mode switch */
1240 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
1241 return IRQ_NONE;
1242
1243
1244 otgsc = readl(USB_OTGSC);
1245 sts = readl(USB_USBSTS);
1246
1247 sts_mask = (otgsc & OTGSC_INTR_MASK) >> 8;
1248
1249 if (!((otgsc & sts_mask) || (sts & STS_PCI))) {
1250 ret = IRQ_NONE;
1251 goto out;
1252 }
1253
1254 spin_lock_irqsave(&dev->lock, flags);
1255 state = dev->otg.state;
1256 spin_unlock_irqrestore(&dev->lock, flags);
1257
1258 pr_debug("IRQ state: %s\n", state_string(state));
1259 pr_debug("otgsc = %x\n", otgsc);
1260
1261 if ((otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) {
1262 if (otgsc & OTGSC_ID) {
1263 pr_debug("Id set\n");
1264 set_bit(ID, &dev->inputs);
1265 } else {
1266 pr_debug("Id clear\n");
1267 /* Assert a_bus_req to supply power on
1268 * VBUS when Micro/Mini-A cable is connected
1269 * with out user intervention.
1270 */
1271 set_bit(A_BUS_REQ, &dev->inputs);
1272 clear_bit(ID, &dev->inputs);
1273 }
1274 writel(otgsc, USB_OTGSC);
1275 work = 1;
1276 } else if (otgsc & OTGSC_BSVIS) {
1277 writel(otgsc, USB_OTGSC);
1278 /* BSV interrupt comes when operating as an A-device
1279 * (VBUS on/off).
1280 * But, handle BSV when charger is removed from ACA in ID_A
1281 */
1282 if ((state >= OTG_STATE_A_IDLE) &&
1283 !test_bit(ID_A, &dev->inputs))
1284 goto out;
1285 if (otgsc & OTGSC_BSV) {
1286 pr_debug("BSV set\n");
1287 set_bit(B_SESS_VLD, &dev->inputs);
1288 } else {
1289 pr_debug("BSV clear\n");
1290 clear_bit(B_SESS_VLD, &dev->inputs);
1291 }
1292 work = 1;
1293 } else if (otgsc & OTGSC_DPIS) {
1294 pr_debug("DPIS detected\n");
1295 writel(otgsc, USB_OTGSC);
1296 set_bit(A_SRP_DET, &dev->inputs);
1297 set_bit(A_BUS_REQ, &dev->inputs);
1298 work = 1;
1299 } else if (sts & STS_PCI) {
1300 pc = readl(USB_PORTSC);
1301 pr_debug("portsc = %x\n", pc);
1302 ret = IRQ_NONE;
1303 /* HCD Acks PCI interrupt. We use this to switch
1304 * between different OTG states.
1305 */
1306 work = 1;
1307 switch (state) {
1308 case OTG_STATE_A_SUSPEND:
1309 if (dev->otg.host->b_hnp_enable && (pc & PORTSC_CSC) &&
1310 !(pc & PORTSC_CCS)) {
1311 pr_debug("B_CONN clear\n");
1312 clear_bit(B_CONN, &dev->inputs);
1313 }
1314 break;
1315 case OTG_STATE_B_WAIT_ACON:
1316 if ((pc & PORTSC_CSC) && (pc & PORTSC_CCS)) {
1317 pr_debug("A_CONN set\n");
1318 set_bit(A_CONN, &dev->inputs);
1319 /* Clear ASE0_BRST timer */
1320 msm_otg_del_timer(dev);
1321 }
1322 break;
1323 case OTG_STATE_B_HOST:
1324 if ((pc & PORTSC_CSC) && !(pc & PORTSC_CCS)) {
1325 pr_debug("A_CONN clear\n");
1326 clear_bit(A_CONN, &dev->inputs);
1327 }
1328 break;
1329 default:
1330 work = 0;
1331 break;
1332 }
1333 }
1334 if (work) {
1335#ifdef CONFIG_USB_MSM_ACA
1336 /* With ACA, ID can change bcoz of BSVIS as well, so update */
1337 if ((otgsc & OTGSC_IDIS) || (otgsc & OTGSC_BSVIS))
1338 set_aca_id_inputs(dev);
1339#endif
1340 wake_lock(&dev->wlock);
1341 queue_work(dev->wq, &dev->sm_work);
1342 }
1343out:
1344 return ret;
1345}
1346
1347#define ULPI_VERIFY_MAX_LOOP_COUNT 5
1348#define PHY_CALIB_RETRY_COUNT 10
1349static void phy_clk_reset(struct msm_otg *dev)
1350{
1351 unsigned rc;
1352 enum clk_reset_action assert = CLK_RESET_ASSERT;
1353
1354 if (dev->pdata->phy_reset_sig_inverted)
1355 assert = CLK_RESET_DEASSERT;
1356
1357 rc = clk_reset(dev->phy_reset_clk, assert);
1358 if (rc) {
1359 pr_err("%s: phy clk assert failed\n", __func__);
1360 return;
1361 }
1362
1363 msleep(1);
1364
1365 rc = clk_reset(dev->phy_reset_clk, !assert);
1366 if (rc) {
1367 pr_err("%s: phy clk deassert failed\n", __func__);
1368 return;
1369 }
1370
1371 msleep(1);
1372}
1373
1374static unsigned ulpi_read_with_reset(struct msm_otg *dev, unsigned reg)
1375{
1376 int temp;
1377 unsigned res;
1378
1379 for (temp = 0; temp < ULPI_VERIFY_MAX_LOOP_COUNT; temp++) {
1380 res = ulpi_read(dev, reg);
1381 if (res != 0xffffffff)
1382 return res;
1383
1384 phy_clk_reset(dev);
1385 }
1386
1387 pr_err("%s: ulpi read failed for %d times\n",
1388 __func__, ULPI_VERIFY_MAX_LOOP_COUNT);
1389
1390 return -1;
1391}
1392
1393static int ulpi_write_with_reset(struct msm_otg *dev,
1394unsigned val, unsigned reg)
1395{
1396 int temp, res;
1397
1398 for (temp = 0; temp < ULPI_VERIFY_MAX_LOOP_COUNT; temp++) {
1399 res = ulpi_write(dev, val, reg);
1400 if (!res)
1401 return 0;
1402 phy_clk_reset(dev);
1403 }
1404 pr_err("%s: ulpi write failed for %d times\n",
1405 __func__, ULPI_VERIFY_MAX_LOOP_COUNT);
1406
1407 return -1;
1408}
1409
1410/* some of the older targets does not turn off the PLL
1411 * if onclock bit is set and clocksuspendM bit is on,
1412 * hence clear them too and initiate the suspend mode
1413 * by clearing SupendM bit.
1414 */
1415static inline int turn_off_phy_pll(struct msm_otg *dev)
1416{
1417 unsigned res;
1418
1419 res = ulpi_read_with_reset(dev, ULPI_CONFIG_REG1);
1420 if (res == 0xffffffff)
1421 return -ETIMEDOUT;
1422
1423 res = ulpi_write_with_reset(dev,
1424 res & ~(ULPI_ONCLOCK), ULPI_CONFIG_REG1);
1425 if (res)
1426 return -ETIMEDOUT;
1427
1428 res = ulpi_write_with_reset(dev,
1429 ULPI_CLOCK_SUSPENDM, ULPI_IFC_CTRL_CLR);
1430 if (res)
1431 return -ETIMEDOUT;
1432
1433 /*Clear SuspendM bit to initiate suspend mode */
1434 res = ulpi_write_with_reset(dev,
1435 ULPI_SUSPENDM, ULPI_FUNC_CTRL_CLR);
1436 if (res)
1437 return -ETIMEDOUT;
1438
1439 return res;
1440}
1441
1442static inline int check_phy_caliberation(struct msm_otg *dev)
1443{
1444 unsigned res;
1445
1446 res = ulpi_read_with_reset(dev, ULPI_DEBUG);
1447
1448 if (res == 0xffffffff)
1449 return -ETIMEDOUT;
1450
1451 if (!(res & ULPI_CALIB_STS) && ULPI_CALIB_VAL(res))
1452 return 0;
1453
1454 return -1;
1455}
1456
1457static int msm_otg_phy_caliberate(struct msm_otg *dev)
1458{
1459 int i = 0;
1460 unsigned long res;
1461
1462 do {
1463 res = turn_off_phy_pll(dev);
1464 if (res)
1465 return -ETIMEDOUT;
1466
1467 /* bring phy out of suspend */
1468 phy_clk_reset(dev);
1469
1470 res = check_phy_caliberation(dev);
1471 if (!res)
1472 return res;
1473 i++;
1474
1475 } while (i < PHY_CALIB_RETRY_COUNT);
1476
1477 return res;
1478}
1479
1480static int msm_otg_phy_reset(struct msm_otg *dev)
1481{
1482 unsigned rc;
1483 unsigned temp;
1484 unsigned long timeout;
1485
Manu Gautam5143b252012-01-05 19:25:23 -08001486 rc = clk_reset(dev->alt_core_clk, CLK_RESET_ASSERT);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001487 if (rc) {
1488 pr_err("%s: usb hs clk assert failed\n", __func__);
1489 return -1;
1490 }
1491
1492 phy_clk_reset(dev);
1493
Manu Gautam5143b252012-01-05 19:25:23 -08001494 rc = clk_reset(dev->alt_core_clk, CLK_RESET_DEASSERT);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001495 if (rc) {
1496 pr_err("%s: usb hs clk deassert failed\n", __func__);
1497 return -1;
1498 }
1499 /* Observing ulpi timeouts as part of PHY calibration. On resetting
1500 * the HW link explicity by setting the RESET bit in the USBCMD
1501 * register before PHY calibration fixes the ulpi timeout issue.
1502 * This workaround is required for unicorn target
1503 */
1504 writel_relaxed(USBCMD_RESET, USB_USBCMD);
1505 timeout = jiffies + USB_LINK_RESET_TIMEOUT;
1506 do {
1507 if (time_after(jiffies, timeout)) {
1508 pr_err("msm_otg: usb link reset timeout\n");
1509 break;
1510 }
1511 usleep_range(1000, 1200);
1512 } while (readl_relaxed(USB_USBCMD) & USBCMD_RESET);
1513
1514 /* select ULPI phy */
1515 temp = (readl(USB_PORTSC) & ~PORTSC_PTS);
1516 writel(temp | PORTSC_PTS_ULPI, USB_PORTSC);
1517
1518 if (atomic_read(&dev->chg_type) !=
1519 USB_CHG_TYPE__WALLCHARGER) {
1520 rc = msm_otg_phy_caliberate(dev);
1521 if (rc)
1522 return rc;
1523 }
1524
1525 /* TBD: There are two link resets. One is below and other one
1526 * is done immediately after this function. See if we can
1527 * eliminate one of these.
1528 */
1529 writel(USBCMD_RESET, USB_USBCMD);
1530 timeout = jiffies + USB_LINK_RESET_TIMEOUT;
1531 do {
1532 if (time_after(jiffies, timeout)) {
1533 pr_err("msm_otg: usb link reset timeout\n");
1534 break;
1535 }
1536 msleep(1);
1537 } while (readl(USB_USBCMD) & USBCMD_RESET);
1538
1539 if (readl(USB_USBCMD) & USBCMD_RESET) {
1540 pr_err("%s: usb core reset failed\n", __func__);
1541 return -1;
1542 }
1543
1544 return 0;
1545}
1546
1547static void otg_reset(struct otg_transceiver *xceiv, int phy_reset)
1548{
1549 struct msm_otg *dev = container_of(xceiv, struct msm_otg, otg);
1550 unsigned long timeout;
1551 u32 mode, work = 0;
1552
Manu Gautam28b1bac2012-01-30 16:43:06 +05301553 clk_prepare_enable(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001554
1555 if (!phy_reset)
1556 goto reset_link;
1557
1558 if (dev->pdata->phy_reset)
1559 dev->pdata->phy_reset(dev->regs);
1560 else
1561 msm_otg_phy_reset(dev);
1562
1563 /*disable all phy interrupts*/
1564 ulpi_write(dev, 0xFF, 0x0F);
1565 ulpi_write(dev, 0xFF, 0x12);
1566 msleep(100);
1567
1568reset_link:
1569 writel(USBCMD_RESET, USB_USBCMD);
1570 timeout = jiffies + USB_LINK_RESET_TIMEOUT;
1571 do {
1572 if (time_after(jiffies, timeout)) {
1573 pr_err("msm_otg: usb link reset timeout\n");
1574 break;
1575 }
1576 msleep(1);
1577 } while (readl(USB_USBCMD) & USBCMD_RESET);
1578
1579 /* select ULPI phy */
1580 writel(0x80000000, USB_PORTSC);
1581
1582 set_pre_emphasis_level(dev);
1583 set_hsdrv_slope(dev);
1584 set_cdr_auto_reset(dev);
1585 set_driver_amplitude(dev);
1586 set_se1_gating(dev);
1587
1588 writel(0x0, USB_AHB_BURST);
1589 writel(0x00, USB_AHB_MODE);
Chandra Devireddyb3fc78c2011-08-30 17:25:55 +05301590 if (dev->pdata->bam_disable) {
1591 writel_relaxed((readl_relaxed(USB_GEN_CONFIG) |
1592 USB_BAM_DISABLE), USB_GEN_CONFIG);
1593 pr_debug("%s(): USB_GEN_CONFIG = %x\n",
1594 __func__, readl_relaxed(USB_GEN_CONFIG));
1595 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001596 /* Ensure that RESET operation is completed before turning off clock */
1597 mb();
1598
Manu Gautam28b1bac2012-01-30 16:43:06 +05301599 clk_disable_unprepare(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001600
1601 if ((xceiv->gadget && xceiv->gadget->is_a_peripheral) ||
1602 test_bit(ID, &dev->inputs))
1603 mode = USBMODE_SDIS | USBMODE_DEVICE;
1604 else
1605 mode = USBMODE_SDIS | USBMODE_HOST;
1606 writel(mode, USB_USBMODE);
1607
1608 writel_relaxed((readl_relaxed(USB_OTGSC) | OTGSC_IDPU), USB_OTGSC);
1609 if (dev->otg.gadget) {
1610 enable_sess_valid(dev);
1611 /* Due to the above 100ms delay, interrupts from PHY are
1612 * sometimes missed during fast plug-in/plug-out of cable.
1613 * Check for such cases here.
1614 */
1615 if (is_b_sess_vld() && !test_bit(B_SESS_VLD, &dev->inputs)) {
1616 pr_debug("%s: handle missing BSV event\n", __func__);
1617 set_bit(B_SESS_VLD, &dev->inputs);
1618 work = 1;
1619 } else if (!is_b_sess_vld() && test_bit(B_SESS_VLD,
1620 &dev->inputs)) {
1621 pr_debug("%s: handle missing !BSV event\n", __func__);
1622 clear_bit(B_SESS_VLD, &dev->inputs);
1623 work = 1;
1624 }
1625 }
1626
1627#ifdef CONFIG_USB_EHCI_MSM_72K
1628 if (dev->otg.host && !dev->pmic_id_notif_supp) {
1629 enable_idgnd(dev);
1630 /* Handle missing ID_GND interrupts during fast PIPO */
1631 if (is_host() && test_bit(ID, &dev->inputs)) {
1632 pr_debug("%s: handle missing ID_GND event\n", __func__);
1633 clear_bit(ID, &dev->inputs);
1634 work = 1;
1635 } else if (!is_host() && !test_bit(ID, &dev->inputs)) {
1636 pr_debug("%s: handle missing !ID_GND event\n",
1637 __func__);
1638 set_bit(ID, &dev->inputs);
1639 work = 1;
1640 }
1641 } else {
1642 disable_idgnd(dev);
1643 }
1644#endif
1645
1646 enable_idabc(dev);
1647
1648 if (work) {
1649 wake_lock(&dev->wlock);
1650 queue_work(dev->wq, &dev->sm_work);
1651 }
1652}
1653
1654static void msm_otg_sm_work(struct work_struct *w)
1655{
1656 struct msm_otg *dev = container_of(w, struct msm_otg, sm_work);
1657 enum chg_type chg_type = atomic_read(&dev->chg_type);
1658 int ret;
1659 int work = 0;
1660 enum usb_otg_state state;
1661 unsigned long flags;
1662
1663 if (atomic_read(&dev->in_lpm))
1664 msm_otg_set_suspend(&dev->otg, 0);
1665
1666 spin_lock_irqsave(&dev->lock, flags);
1667 state = dev->otg.state;
1668 spin_unlock_irqrestore(&dev->lock, flags);
1669
1670 switch (state) {
1671 case OTG_STATE_UNDEFINED:
1672
1673 /*
1674 * We can come here when LPM fails with wall charger
Pavankumar Kondetidc60f122011-09-13 11:17:16 +05301675 * connected. Change the state to B_PERIPHERAL and
1676 * schedule the work which takes care of resetting the
1677 * PHY and putting the hardware in low power mode.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001678 */
1679 if (atomic_read(&dev->chg_type) ==
1680 USB_CHG_TYPE__WALLCHARGER) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001681 spin_lock_irqsave(&dev->lock, flags);
1682 dev->otg.state = OTG_STATE_B_PERIPHERAL;
1683 spin_unlock_irqrestore(&dev->lock, flags);
1684 work = 1;
1685 break;
1686 }
1687
1688 /* Reset both phy and link */
1689 otg_reset(&dev->otg, 1);
1690
1691#ifdef CONFIG_USB_MSM_ACA
1692 set_aca_id_inputs(dev);
1693#endif
1694 if (dev->pdata->otg_mode == OTG_USER_CONTROL) {
1695 if ((dev->pdata->usb_mode == USB_PERIPHERAL_MODE) ||
1696 !dev->otg.host) {
1697 set_bit(ID, &dev->inputs);
1698 set_bit(B_SESS_VLD, &dev->inputs);
1699 }
1700 } else {
1701 if (!dev->otg.host || !is_host())
1702 set_bit(ID, &dev->inputs);
1703
1704 if (dev->otg.gadget && is_b_sess_vld())
1705 set_bit(B_SESS_VLD, &dev->inputs);
1706 }
1707 spin_lock_irqsave(&dev->lock, flags);
1708 if ((test_bit(ID, &dev->inputs)) &&
1709 !test_bit(ID_A, &dev->inputs)) {
1710 dev->otg.state = OTG_STATE_B_IDLE;
1711 } else {
1712 set_bit(A_BUS_REQ, &dev->inputs);
1713 dev->otg.state = OTG_STATE_A_IDLE;
1714 }
1715 spin_unlock_irqrestore(&dev->lock, flags);
1716
1717 work = 1;
1718 break;
1719 case OTG_STATE_B_IDLE:
1720 dev->otg.default_a = 0;
1721 if (!test_bit(ID, &dev->inputs) ||
1722 test_bit(ID_A, &dev->inputs)) {
1723 pr_debug("!id || id_A\n");
1724 clear_bit(B_BUS_REQ, &dev->inputs);
1725 otg_reset(&dev->otg, 0);
1726
1727 spin_lock_irqsave(&dev->lock, flags);
1728 dev->otg.state = OTG_STATE_A_IDLE;
1729 spin_unlock_irqrestore(&dev->lock, flags);
1730 msm_otg_set_power(&dev->otg, 0);
1731 work = 1;
1732 } else if (test_bit(B_SESS_VLD, &dev->inputs) &&
1733 !test_bit(ID_B, &dev->inputs)) {
1734 pr_debug("b_sess_vld\n");
1735 spin_lock_irqsave(&dev->lock, flags);
1736 dev->otg.state = OTG_STATE_B_PERIPHERAL;
1737 spin_unlock_irqrestore(&dev->lock, flags);
1738 msm_otg_set_power(&dev->otg, 0);
1739 msm_otg_start_peripheral(&dev->otg, 1);
1740 } else if (test_bit(B_BUS_REQ, &dev->inputs)) {
1741 pr_debug("b_sess_end && b_bus_req\n");
1742 ret = msm_otg_start_srp(&dev->otg);
1743 if (ret < 0) {
1744 /* notify user space */
1745 clear_bit(B_BUS_REQ, &dev->inputs);
1746 work = 1;
1747 break;
1748 }
1749 spin_lock_irqsave(&dev->lock, flags);
1750 dev->otg.state = OTG_STATE_B_SRP_INIT;
1751 spin_unlock_irqrestore(&dev->lock, flags);
1752 msm_otg_start_timer(dev, TB_SRP_FAIL, B_SRP_FAIL);
1753 break;
1754 } else if (test_bit(ID_B, &dev->inputs)) {
1755 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
1756 msm_otg_set_power(&dev->otg, USB_IDCHG_MAX);
1757 } else {
1758 msm_otg_set_power(&dev->otg, 0);
1759 pr_debug("entering into lpm\n");
1760 msm_otg_put_suspend(dev);
1761
1762 if (dev->pdata->ldo_set_voltage)
1763 dev->pdata->ldo_set_voltage(3075);
1764 }
1765 break;
1766 case OTG_STATE_B_SRP_INIT:
1767 if (!test_bit(ID, &dev->inputs) ||
1768 test_bit(ID_A, &dev->inputs) ||
1769 test_bit(ID_C, &dev->inputs) ||
1770 (test_bit(B_SESS_VLD, &dev->inputs) &&
1771 !test_bit(ID_B, &dev->inputs))) {
1772 pr_debug("!id || id_a/c || b_sess_vld+!id_b\n");
1773 msm_otg_del_timer(dev);
1774 spin_lock_irqsave(&dev->lock, flags);
1775 dev->otg.state = OTG_STATE_B_IDLE;
1776 spin_unlock_irqrestore(&dev->lock, flags);
1777 work = 1;
1778 } else if (test_bit(B_SRP_FAIL, &dev->tmouts)) {
1779 pr_debug("b_srp_fail\n");
1780 /* notify user space */
1781 msm_otg_send_event(&dev->otg,
1782 OTG_EVENT_NO_RESP_FOR_SRP);
1783 clear_bit(B_BUS_REQ, &dev->inputs);
1784 clear_bit(B_SRP_FAIL, &dev->tmouts);
1785 spin_lock_irqsave(&dev->lock, flags);
1786 dev->otg.state = OTG_STATE_B_IDLE;
1787 spin_unlock_irqrestore(&dev->lock, flags);
1788 dev->b_last_se0_sess = jiffies;
1789 work = 1;
1790 }
1791 break;
1792 case OTG_STATE_B_PERIPHERAL:
1793 if (!test_bit(ID, &dev->inputs) ||
1794 test_bit(ID_A, &dev->inputs) ||
1795 test_bit(ID_B, &dev->inputs) ||
1796 !test_bit(B_SESS_VLD, &dev->inputs)) {
1797 pr_debug("!id || id_a/b || !b_sess_vld\n");
1798 clear_bit(B_BUS_REQ, &dev->inputs);
1799 spin_lock_irqsave(&dev->lock, flags);
1800 dev->otg.state = OTG_STATE_B_IDLE;
1801 spin_unlock_irqrestore(&dev->lock, flags);
1802 msm_otg_start_peripheral(&dev->otg, 0);
1803 dev->b_last_se0_sess = jiffies;
1804
1805 /* Workaround: Reset phy after session */
1806 otg_reset(&dev->otg, 1);
1807 work = 1;
1808 } else if (test_bit(B_BUS_REQ, &dev->inputs) &&
1809 dev->otg.gadget->b_hnp_enable &&
1810 test_bit(A_BUS_SUSPEND, &dev->inputs)) {
1811 pr_debug("b_bus_req && b_hnp_en && a_bus_suspend\n");
1812 msm_otg_start_timer(dev, TB_ASE0_BRST, B_ASE0_BRST);
1813 msm_otg_start_peripheral(&dev->otg, 0);
1814 spin_lock_irqsave(&dev->lock, flags);
1815 dev->otg.state = OTG_STATE_B_WAIT_ACON;
1816 spin_unlock_irqrestore(&dev->lock, flags);
1817 /* start HCD even before A-device enable
1818 * pull-up to meet HNP timings.
1819 */
1820 dev->otg.host->is_b_host = 1;
1821 msm_otg_start_host(&dev->otg, REQUEST_START);
1822
1823 } else if (test_bit(ID_C, &dev->inputs)) {
1824 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
1825 msm_otg_set_power(&dev->otg, USB_IDCHG_MAX);
1826 } else if (chg_type == USB_CHG_TYPE__WALLCHARGER) {
1827#ifdef CONFIG_USB_MSM_ACA
1828 del_timer_sync(&dev->id_timer);
1829#endif
1830 /* Workaround: Reset PHY in SE1 state */
1831 otg_reset(&dev->otg, 1);
1832 pr_debug("entering into lpm with wall-charger\n");
1833 msm_otg_put_suspend(dev);
1834 /* Allow idle power collapse */
1835 otg_pm_qos_update_latency(dev, 0);
1836 }
1837 break;
1838 case OTG_STATE_B_WAIT_ACON:
1839 if (!test_bit(ID, &dev->inputs) ||
1840 test_bit(ID_A, &dev->inputs) ||
1841 test_bit(ID_B, &dev->inputs) ||
1842 !test_bit(B_SESS_VLD, &dev->inputs)) {
1843 pr_debug("!id || id_a/b || !b_sess_vld\n");
1844 msm_otg_del_timer(dev);
1845 /* A-device is physically disconnected during
1846 * HNP. Remove HCD.
1847 */
1848 msm_otg_start_host(&dev->otg, REQUEST_STOP);
1849 dev->otg.host->is_b_host = 0;
1850
1851 clear_bit(B_BUS_REQ, &dev->inputs);
1852 clear_bit(A_BUS_SUSPEND, &dev->inputs);
1853 dev->b_last_se0_sess = jiffies;
1854 spin_lock_irqsave(&dev->lock, flags);
1855 dev->otg.state = OTG_STATE_B_IDLE;
1856 spin_unlock_irqrestore(&dev->lock, flags);
1857
1858 /* Workaround: Reset phy after session */
1859 otg_reset(&dev->otg, 1);
1860 work = 1;
1861 } else if (test_bit(A_CONN, &dev->inputs)) {
1862 pr_debug("a_conn\n");
1863 clear_bit(A_BUS_SUSPEND, &dev->inputs);
1864 spin_lock_irqsave(&dev->lock, flags);
1865 dev->otg.state = OTG_STATE_B_HOST;
1866 spin_unlock_irqrestore(&dev->lock, flags);
1867 if (test_bit(ID_C, &dev->inputs)) {
1868 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
1869 msm_otg_set_power(&dev->otg, USB_IDCHG_MAX);
1870 }
1871 } else if (test_bit(B_ASE0_BRST, &dev->tmouts)) {
1872 /* TODO: A-device may send reset after
1873 * enabling HNP; a_bus_resume case is
1874 * not handled for now.
1875 */
1876 pr_debug("b_ase0_brst_tmout\n");
1877 msm_otg_send_event(&dev->otg,
1878 OTG_EVENT_HNP_FAILED);
1879 msm_otg_start_host(&dev->otg, REQUEST_STOP);
1880 dev->otg.host->is_b_host = 0;
1881 clear_bit(B_ASE0_BRST, &dev->tmouts);
1882 clear_bit(A_BUS_SUSPEND, &dev->inputs);
1883 clear_bit(B_BUS_REQ, &dev->inputs);
1884
1885 spin_lock_irqsave(&dev->lock, flags);
1886 dev->otg.state = OTG_STATE_B_PERIPHERAL;
1887 spin_unlock_irqrestore(&dev->lock, flags);
1888 msm_otg_start_peripheral(&dev->otg, 1);
1889 } else if (test_bit(ID_C, &dev->inputs)) {
1890 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
1891 msm_otg_set_power(&dev->otg, USB_IDCHG_MAX);
1892 }
1893 break;
1894 case OTG_STATE_B_HOST:
1895 /* B_BUS_REQ is not exposed to user space. So
1896 * it must be A_CONN for now.
1897 */
1898 if (!test_bit(B_BUS_REQ, &dev->inputs) ||
1899 !test_bit(A_CONN, &dev->inputs)) {
1900 pr_debug("!b_bus_req || !a_conn\n");
1901 clear_bit(A_CONN, &dev->inputs);
1902 clear_bit(B_BUS_REQ, &dev->inputs);
1903
1904 msm_otg_start_host(&dev->otg, REQUEST_STOP);
1905 dev->otg.host->is_b_host = 0;
1906
1907 spin_lock_irqsave(&dev->lock, flags);
1908 dev->otg.state = OTG_STATE_B_IDLE;
1909 spin_unlock_irqrestore(&dev->lock, flags);
1910 /* Workaround: Reset phy after session */
1911 otg_reset(&dev->otg, 1);
1912 work = 1;
1913 } else if (test_bit(ID_C, &dev->inputs)) {
1914 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
1915 msm_otg_set_power(&dev->otg, USB_IDCHG_MAX);
1916 }
1917 break;
1918 case OTG_STATE_A_IDLE:
1919 dev->otg.default_a = 1;
1920 if (test_bit(ID, &dev->inputs) &&
1921 !test_bit(ID_A, &dev->inputs)) {
1922 pr_debug("id && !id_a\n");
1923 dev->otg.default_a = 0;
1924 otg_reset(&dev->otg, 0);
1925 spin_lock_irqsave(&dev->lock, flags);
1926 dev->otg.state = OTG_STATE_B_IDLE;
1927 spin_unlock_irqrestore(&dev->lock, flags);
1928 msm_otg_set_power(&dev->otg, 0);
1929 work = 1;
1930 } else if (!test_bit(A_BUS_DROP, &dev->inputs) &&
1931 (test_bit(A_SRP_DET, &dev->inputs) ||
1932 test_bit(A_BUS_REQ, &dev->inputs))) {
1933 pr_debug("!a_bus_drop && (a_srp_det || a_bus_req)\n");
1934
1935 clear_bit(A_SRP_DET, &dev->inputs);
1936 /* Disable SRP detection */
1937 writel((readl(USB_OTGSC) & ~OTGSC_INTR_STS_MASK) &
1938 ~OTGSC_DPIE, USB_OTGSC);
1939
1940 spin_lock_irqsave(&dev->lock, flags);
1941 dev->otg.state = OTG_STATE_A_WAIT_VRISE;
1942 spin_unlock_irqrestore(&dev->lock, flags);
1943 /* ACA: ID_A: Stop charging untill enumeration */
1944 if (test_bit(ID_A, &dev->inputs))
1945 msm_otg_set_power(&dev->otg, 0);
1946 else
1947 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
1948 msm_otg_start_timer(dev, TA_WAIT_VRISE, A_WAIT_VRISE);
1949 /* no need to schedule work now */
1950 } else {
1951 pr_debug("No session requested\n");
1952
1953 /* A-device is not providing power on VBUS.
1954 * Enable SRP detection.
1955 */
1956 writel((readl(USB_OTGSC) & ~OTGSC_INTR_STS_MASK) |
1957 OTGSC_DPIE, USB_OTGSC);
1958 msm_otg_put_suspend(dev);
1959
1960 }
1961 break;
1962 case OTG_STATE_A_WAIT_VRISE:
1963 if ((test_bit(ID, &dev->inputs) &&
1964 !test_bit(ID_A, &dev->inputs)) ||
1965 test_bit(A_BUS_DROP, &dev->inputs) ||
1966 test_bit(A_WAIT_VRISE, &dev->tmouts)) {
1967 pr_debug("id || a_bus_drop || a_wait_vrise_tmout\n");
1968 clear_bit(A_BUS_REQ, &dev->inputs);
1969 msm_otg_del_timer(dev);
1970 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
1971 spin_lock_irqsave(&dev->lock, flags);
1972 dev->otg.state = OTG_STATE_A_WAIT_VFALL;
1973 spin_unlock_irqrestore(&dev->lock, flags);
1974 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
1975 } else if (test_bit(A_VBUS_VLD, &dev->inputs)) {
1976 pr_debug("a_vbus_vld\n");
1977 spin_lock_irqsave(&dev->lock, flags);
1978 dev->otg.state = OTG_STATE_A_WAIT_BCON;
1979 spin_unlock_irqrestore(&dev->lock, flags);
1980 if (TA_WAIT_BCON > 0)
1981 msm_otg_start_timer(dev, TA_WAIT_BCON,
1982 A_WAIT_BCON);
1983 /* Start HCD to detect peripherals. */
1984 msm_otg_start_host(&dev->otg, REQUEST_START);
1985 }
1986 break;
1987 case OTG_STATE_A_WAIT_BCON:
1988 if ((test_bit(ID, &dev->inputs) &&
1989 !test_bit(ID_A, &dev->inputs)) ||
1990 test_bit(A_BUS_DROP, &dev->inputs) ||
1991 test_bit(A_WAIT_BCON, &dev->tmouts)) {
1992 pr_debug("id_f/b/c || a_bus_drop ||"
1993 "a_wait_bcon_tmout\n");
1994 if (test_bit(A_WAIT_BCON, &dev->tmouts))
1995 msm_otg_send_event(&dev->otg,
1996 OTG_EVENT_DEV_CONN_TMOUT);
1997 msm_otg_del_timer(dev);
1998 clear_bit(A_BUS_REQ, &dev->inputs);
1999 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2000 /* Reset both phy and link */
2001 otg_reset(&dev->otg, 1);
2002 /* ACA: ID_A with NO accessory, just the A plug is
2003 * attached to ACA: Use IDCHG_MAX for charging
2004 */
2005 if (test_bit(ID_A, &dev->inputs))
2006 msm_otg_set_power(&dev->otg, USB_IDCHG_MAX);
2007 else
2008 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2009 spin_lock_irqsave(&dev->lock, flags);
2010 dev->otg.state = OTG_STATE_A_WAIT_VFALL;
2011 spin_unlock_irqrestore(&dev->lock, flags);
2012 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
2013 } else if (test_bit(B_CONN, &dev->inputs)) {
2014 pr_debug("b_conn\n");
2015 msm_otg_del_timer(dev);
2016 /* HCD is added already. just move to
2017 * A_HOST state.
2018 */
2019 spin_lock_irqsave(&dev->lock, flags);
2020 dev->otg.state = OTG_STATE_A_HOST;
2021 spin_unlock_irqrestore(&dev->lock, flags);
2022 if (test_bit(ID_A, &dev->inputs)) {
2023 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
2024 msm_otg_set_power(&dev->otg,
2025 USB_IDCHG_MIN - get_aca_bmaxpower(dev));
2026 }
2027 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2028 pr_debug("!a_vbus_vld\n");
2029 msm_otg_del_timer(dev);
2030 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2031 spin_lock_irqsave(&dev->lock, flags);
2032 dev->otg.state = OTG_STATE_A_VBUS_ERR;
2033 spin_unlock_irqrestore(&dev->lock, flags);
2034 /* Reset both phy and link */
2035 otg_reset(&dev->otg, 1);
2036 } else if (test_bit(ID_A, &dev->inputs)) {
2037 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2038 } else if (!test_bit(ID, &dev->inputs)) {
Anji jonnalaae745e92011-11-14 18:34:31 +05302039 msm_otg_set_power(&dev->otg, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002040 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2041 }
2042 break;
2043 case OTG_STATE_A_HOST:
2044 if ((test_bit(ID, &dev->inputs) &&
2045 !test_bit(ID_A, &dev->inputs)) ||
2046 test_bit(A_BUS_DROP, &dev->inputs)) {
2047 pr_debug("id_f/b/c || a_bus_drop\n");
2048 clear_bit(B_CONN, &dev->inputs);
2049 spin_lock_irqsave(&dev->lock, flags);
2050 dev->otg.state = OTG_STATE_A_WAIT_VFALL;
2051 spin_unlock_irqrestore(&dev->lock, flags);
2052 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2053 /* Reset both phy and link */
2054 otg_reset(&dev->otg, 1);
2055 if (!test_bit(ID_A, &dev->inputs))
2056 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2057 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
2058 msm_otg_set_power(&dev->otg, 0);
2059 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2060 pr_debug("!a_vbus_vld\n");
2061 clear_bit(B_CONN, &dev->inputs);
2062 spin_lock_irqsave(&dev->lock, flags);
2063 dev->otg.state = OTG_STATE_A_VBUS_ERR;
2064 spin_unlock_irqrestore(&dev->lock, flags);
2065 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2066 /* Reset both phy and link */
2067 otg_reset(&dev->otg, 1);
2068 /* no work */
2069 } else if (!test_bit(A_BUS_REQ, &dev->inputs)) {
2070 /* a_bus_req is de-asserted when root hub is
2071 * suspended or HNP is in progress.
2072 */
2073 pr_debug("!a_bus_req\n");
2074 spin_lock_irqsave(&dev->lock, flags);
2075 dev->otg.state = OTG_STATE_A_SUSPEND;
2076 spin_unlock_irqrestore(&dev->lock, flags);
2077 if (dev->otg.host->b_hnp_enable) {
2078 msm_otg_start_timer(dev, TA_AIDL_BDIS,
2079 A_AIDL_BDIS);
2080 } else {
2081 /* No HNP. Root hub suspended */
2082 msm_otg_put_suspend(dev);
2083 }
2084 if (test_bit(ID_A, &dev->inputs))
2085 msm_otg_set_power(&dev->otg,
2086 USB_IDCHG_MIN - USB_IB_UNCFG);
2087 } else if (!test_bit(B_CONN, &dev->inputs)) {
2088 pr_debug("!b_conn\n");
2089 spin_lock_irqsave(&dev->lock, flags);
2090 dev->otg.state = OTG_STATE_A_WAIT_BCON;
2091 spin_unlock_irqrestore(&dev->lock, flags);
2092 if (TA_WAIT_BCON > 0)
2093 msm_otg_start_timer(dev, TA_WAIT_BCON,
2094 A_WAIT_BCON);
2095 } else if (test_bit(ID_A, &dev->inputs)) {
2096 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
2097 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2098 msm_otg_set_power(&dev->otg,
2099 USB_IDCHG_MIN - get_aca_bmaxpower(dev));
2100 } else if (!test_bit(ID, &dev->inputs)) {
2101 atomic_set(&dev->chg_type, USB_CHG_TYPE__INVALID);
2102 msm_otg_set_power(&dev->otg, 0);
2103 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2104 }
2105 break;
2106 case OTG_STATE_A_SUSPEND:
2107 if ((test_bit(ID, &dev->inputs) &&
2108 !test_bit(ID_A, &dev->inputs)) ||
2109 test_bit(A_BUS_DROP, &dev->inputs) ||
2110 test_bit(A_AIDL_BDIS, &dev->tmouts)) {
2111 pr_debug("id_f/b/c || a_bus_drop ||"
2112 "a_aidl_bdis_tmout\n");
2113 if (test_bit(A_AIDL_BDIS, &dev->tmouts))
2114 msm_otg_send_event(&dev->otg,
2115 OTG_EVENT_HNP_FAILED);
2116 msm_otg_del_timer(dev);
2117 clear_bit(B_CONN, &dev->inputs);
2118 spin_lock_irqsave(&dev->lock, flags);
2119 dev->otg.state = OTG_STATE_A_WAIT_VFALL;
2120 spin_unlock_irqrestore(&dev->lock, flags);
2121 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2122 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2123 /* Reset both phy and link */
2124 otg_reset(&dev->otg, 1);
2125 if (!test_bit(ID_A, &dev->inputs))
2126 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2127 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
2128 msm_otg_set_power(&dev->otg, 0);
2129 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2130 pr_debug("!a_vbus_vld\n");
2131 msm_otg_del_timer(dev);
2132 clear_bit(B_CONN, &dev->inputs);
2133 spin_lock_irqsave(&dev->lock, flags);
2134 dev->otg.state = OTG_STATE_A_VBUS_ERR;
2135 spin_unlock_irqrestore(&dev->lock, flags);
2136 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2137 /* Reset both phy and link */
2138 otg_reset(&dev->otg, 1);
2139 } else if (!test_bit(B_CONN, &dev->inputs) &&
2140 dev->otg.host->b_hnp_enable) {
2141 pr_debug("!b_conn && b_hnp_enable");
2142 /* Clear AIDL_BDIS timer */
2143 msm_otg_del_timer(dev);
2144 spin_lock_irqsave(&dev->lock, flags);
2145 dev->otg.state = OTG_STATE_A_PERIPHERAL;
2146 spin_unlock_irqrestore(&dev->lock, flags);
2147
2148 msm_otg_start_host(&dev->otg, REQUEST_HNP_SUSPEND);
2149
2150 /* We may come here even when B-dev is physically
2151 * disconnected during HNP. We go back to host
2152 * role if bus is idle for BIDL_ADIS time.
2153 */
2154 dev->otg.gadget->is_a_peripheral = 1;
2155 msm_otg_start_peripheral(&dev->otg, 1);
2156 /* If ID_A: we can charge in a_peripheral as well */
2157 if (test_bit(ID_A, &dev->inputs)) {
2158 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
2159 msm_otg_set_power(&dev->otg,
2160 USB_IDCHG_MIN - USB_IB_UNCFG);
2161 }
2162 } else if (!test_bit(B_CONN, &dev->inputs) &&
2163 !dev->otg.host->b_hnp_enable) {
2164 pr_debug("!b_conn && !b_hnp_enable");
2165 /* bus request is dropped during suspend.
2166 * acquire again for next device.
2167 */
2168 set_bit(A_BUS_REQ, &dev->inputs);
2169 spin_lock_irqsave(&dev->lock, flags);
2170 dev->otg.state = OTG_STATE_A_WAIT_BCON;
2171 spin_unlock_irqrestore(&dev->lock, flags);
2172 if (TA_WAIT_BCON > 0)
2173 msm_otg_start_timer(dev, TA_WAIT_BCON,
2174 A_WAIT_BCON);
2175 msm_otg_set_power(&dev->otg, 0);
2176 } else if (test_bit(ID_A, &dev->inputs)) {
2177 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2178 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
2179 msm_otg_set_power(&dev->otg,
2180 USB_IDCHG_MIN - USB_IB_UNCFG);
2181 } else if (!test_bit(ID, &dev->inputs)) {
2182 msm_otg_set_power(&dev->otg, 0);
2183 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2184 }
2185 break;
2186 case OTG_STATE_A_PERIPHERAL:
2187 if ((test_bit(ID, &dev->inputs) &&
2188 !test_bit(ID_A, &dev->inputs)) ||
2189 test_bit(A_BUS_DROP, &dev->inputs)) {
2190 pr_debug("id _f/b/c || a_bus_drop\n");
2191 /* Clear BIDL_ADIS timer */
2192 msm_otg_del_timer(dev);
2193 spin_lock_irqsave(&dev->lock, flags);
2194 dev->otg.state = OTG_STATE_A_WAIT_VFALL;
2195 spin_unlock_irqrestore(&dev->lock, flags);
2196 msm_otg_start_peripheral(&dev->otg, 0);
2197 dev->otg.gadget->is_a_peripheral = 0;
2198 /* HCD was suspended before. Stop it now */
2199 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2200
2201 /* Reset both phy and link */
2202 otg_reset(&dev->otg, 1);
2203 if (!test_bit(ID_A, &dev->inputs))
2204 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2205 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
2206 msm_otg_set_power(&dev->otg, 0);
2207 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2208 pr_debug("!a_vbus_vld\n");
2209 /* Clear BIDL_ADIS timer */
2210 msm_otg_del_timer(dev);
2211 spin_lock_irqsave(&dev->lock, flags);
2212 dev->otg.state = OTG_STATE_A_VBUS_ERR;
2213 spin_unlock_irqrestore(&dev->lock, flags);
2214 msm_otg_start_peripheral(&dev->otg, 0);
2215 dev->otg.gadget->is_a_peripheral = 0;
2216 /* HCD was suspended before. Stop it now */
2217 msm_otg_start_host(&dev->otg, REQUEST_STOP);
2218 } else if (test_bit(A_BIDL_ADIS, &dev->tmouts)) {
2219 pr_debug("a_bidl_adis_tmout\n");
2220 msm_otg_start_peripheral(&dev->otg, 0);
2221 dev->otg.gadget->is_a_peripheral = 0;
2222
2223 spin_lock_irqsave(&dev->lock, flags);
2224 dev->otg.state = OTG_STATE_A_WAIT_BCON;
2225 spin_unlock_irqrestore(&dev->lock, flags);
2226 set_bit(A_BUS_REQ, &dev->inputs);
2227 msm_otg_start_host(&dev->otg, REQUEST_HNP_RESUME);
2228 if (TA_WAIT_BCON > 0)
2229 msm_otg_start_timer(dev, TA_WAIT_BCON,
2230 A_WAIT_BCON);
2231 msm_otg_set_power(&dev->otg, 0);
2232 } else if (test_bit(ID_A, &dev->inputs)) {
2233 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2234 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
2235 msm_otg_set_power(&dev->otg,
2236 USB_IDCHG_MIN - USB_IB_UNCFG);
2237 } else if (!test_bit(ID, &dev->inputs)) {
2238 msm_otg_set_power(&dev->otg, 0);
2239 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2240 }
2241 break;
2242 case OTG_STATE_A_WAIT_VFALL:
2243 if (test_bit(A_WAIT_VFALL, &dev->tmouts)) {
2244 clear_bit(A_VBUS_VLD, &dev->inputs);
2245 spin_lock_irqsave(&dev->lock, flags);
2246 dev->otg.state = OTG_STATE_A_IDLE;
2247 spin_unlock_irqrestore(&dev->lock, flags);
2248 work = 1;
2249 }
2250 break;
2251 case OTG_STATE_A_VBUS_ERR:
2252 if ((test_bit(ID, &dev->inputs) &&
2253 !test_bit(ID_A, &dev->inputs)) ||
2254 test_bit(A_BUS_DROP, &dev->inputs) ||
2255 test_bit(A_CLR_ERR, &dev->inputs)) {
2256 spin_lock_irqsave(&dev->lock, flags);
2257 dev->otg.state = OTG_STATE_A_WAIT_VFALL;
2258 spin_unlock_irqrestore(&dev->lock, flags);
2259 if (!test_bit(ID_A, &dev->inputs))
2260 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2261 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
2262 msm_otg_set_power(&dev->otg, 0);
2263 }
2264 break;
2265 default:
2266 pr_err("invalid OTG state\n");
2267 }
2268
2269 if (work)
2270 queue_work(dev->wq, &dev->sm_work);
2271
2272#ifdef CONFIG_USB_MSM_ACA
2273 /* Start id_polling if (ID_FLOAT&BSV) || ID_A/B/C */
2274 if ((test_bit(ID, &dev->inputs) &&
2275 test_bit(B_SESS_VLD, &dev->inputs) &&
2276 chg_type != USB_CHG_TYPE__WALLCHARGER) ||
2277 test_bit(ID_A, &dev->inputs)) {
2278 mod_timer(&dev->id_timer, jiffies +
2279 msecs_to_jiffies(OTG_ID_POLL_MS));
2280 return;
2281 }
2282 del_timer(&dev->id_timer);
2283#endif
2284 /* IRQ/sysfs may queue work. Check work_pending. otherwise
2285 * we might endup releasing wakelock after it is acquired
2286 * in IRQ/sysfs.
2287 */
2288 if (!work_pending(&dev->sm_work) && !hrtimer_active(&dev->timer) &&
2289 !work_pending(&dev->otg_resume_work))
2290 wake_unlock(&dev->wlock);
2291}
2292
2293#ifdef CONFIG_USB_MSM_ACA
2294static void msm_otg_id_func(unsigned long _dev)
2295{
2296 struct msm_otg *dev = (struct msm_otg *) _dev;
2297 u8 phy_ints;
2298
2299#ifdef CONFIG_USB_MSM_STANDARD_ACA
2300 /*
2301 * When standard ACA is attached RID_A and RID_GND states are only
2302 * possible. RID_A-->RID_GND transition generates IdGnd interrupt
2303 * from PHY. Hence polling is disabled.
2304 */
2305 if (test_bit(ID_A, &dev->inputs))
2306 goto out;
2307#endif
2308
2309 if (atomic_read(&dev->in_lpm))
2310 msm_otg_set_suspend(&dev->otg, 0);
2311
2312 phy_ints = ulpi_read(dev, 0x13);
2313
2314 /*
2315 * ACA timer will be kicked again after the PHY
2316 * state is recovered.
2317 */
2318 if (phy_ints == -ETIMEDOUT)
2319 return;
2320
2321
2322 /* If id_gnd happened then stop and let isr take care of this */
2323 if (phy_id_state_gnd(phy_ints))
2324 goto out;
2325
2326 if ((test_bit(ID_A, &dev->inputs) == phy_id_state_a(phy_ints)) &&
2327 (test_bit(ID_B, &dev->inputs) == phy_id_state_b(phy_ints)) &&
2328 (test_bit(ID_C, &dev->inputs) == phy_id_state_c(phy_ints))) {
2329 mod_timer(&dev->id_timer,
2330 jiffies + msecs_to_jiffies(OTG_ID_POLL_MS));
2331 goto out;
2332 } else {
2333 set_aca_id_inputs(dev);
2334 }
2335 wake_lock(&dev->wlock);
2336 queue_work(dev->wq, &dev->sm_work);
2337out:
2338 /* OOPS: runing while !BSV, schedule work to initiate LPM */
2339 if (!is_b_sess_vld()) {
2340 clear_bit(B_SESS_VLD, &dev->inputs);
2341 wake_lock(&dev->wlock);
2342 queue_work(dev->wq, &dev->sm_work);
2343 }
2344 return;
2345}
2346#endif
2347#ifdef CONFIG_USB_OTG
2348static ssize_t
2349set_pwr_down(struct device *_dev, struct device_attribute *attr,
2350 const char *buf, size_t count)
2351{
2352 struct msm_otg *dev = the_msm_otg;
2353 int value;
2354 enum usb_otg_state state;
2355 unsigned long flags;
2356
2357 spin_lock_irqsave(&dev->lock, flags);
2358 state = dev->otg.state;
2359 spin_unlock_irqrestore(&dev->lock, flags);
2360
2361 /* Applicable for only A-Device */
2362 if (state <= OTG_STATE_A_IDLE)
2363 return -EINVAL;
2364
2365 sscanf(buf, "%d", &value);
2366
2367 if (test_bit(A_BUS_DROP, &dev->inputs) != !!value) {
2368 change_bit(A_BUS_DROP, &dev->inputs);
2369 wake_lock(&dev->wlock);
2370 queue_work(dev->wq, &dev->sm_work);
2371 }
2372
2373 return count;
2374}
2375static DEVICE_ATTR(pwr_down, S_IRUGO | S_IWUSR, NULL, set_pwr_down);
2376
2377static ssize_t
2378set_srp_req(struct device *_dev, struct device_attribute *attr,
2379 const char *buf, size_t count)
2380{
2381 struct msm_otg *dev = the_msm_otg;
2382 enum usb_otg_state state;
2383 unsigned long flags;
2384
2385 spin_lock_irqsave(&dev->lock, flags);
2386 state = dev->otg.state;
2387 spin_unlock_irqrestore(&dev->lock, flags);
2388
2389 if (state != OTG_STATE_B_IDLE)
2390 return -EINVAL;
2391
2392 set_bit(B_BUS_REQ, &dev->inputs);
2393 wake_lock(&dev->wlock);
2394 queue_work(dev->wq, &dev->sm_work);
2395
2396 return count;
2397}
2398static DEVICE_ATTR(srp_req, S_IRUGO | S_IWUSR, NULL, set_srp_req);
2399
2400static ssize_t
2401set_clr_err(struct device *_dev, struct device_attribute *attr,
2402 const char *buf, size_t count)
2403{
2404 struct msm_otg *dev = the_msm_otg;
2405 enum usb_otg_state state;
2406 unsigned long flags;
2407
2408 spin_lock_irqsave(&dev->lock, flags);
2409 state = dev->otg.state;
2410 spin_unlock_irqrestore(&dev->lock, flags);
2411
2412 if (state == OTG_STATE_A_VBUS_ERR) {
2413 set_bit(A_CLR_ERR, &dev->inputs);
2414 wake_lock(&dev->wlock);
2415 queue_work(dev->wq, &dev->sm_work);
2416 }
2417
2418 return count;
2419}
2420static DEVICE_ATTR(clr_err, S_IRUGO | S_IWUSR, NULL, set_clr_err);
2421
2422static struct attribute *msm_otg_attrs[] = {
2423 &dev_attr_pwr_down.attr,
2424 &dev_attr_srp_req.attr,
2425 &dev_attr_clr_err.attr,
2426 NULL,
2427};
2428
2429static struct attribute_group msm_otg_attr_grp = {
2430 .attrs = msm_otg_attrs,
2431};
2432#endif
2433
2434#ifdef CONFIG_DEBUG_FS
2435static int otg_open(struct inode *inode, struct file *file)
2436{
2437 file->private_data = inode->i_private;
2438 return 0;
2439}
2440static ssize_t otg_mode_write(struct file *file, const char __user *buf,
2441 size_t count, loff_t *ppos)
2442{
2443 struct msm_otg *dev = file->private_data;
2444 int ret = count;
2445 int work = 0;
2446 unsigned long flags;
2447
2448 spin_lock_irqsave(&dev->lock, flags);
2449 dev->pdata->otg_mode = OTG_USER_CONTROL;
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05302450 if (!memcmp(buf, "none", 4)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002451 clear_bit(B_SESS_VLD, &dev->inputs);
2452 set_bit(ID, &dev->inputs);
2453 work = 1;
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05302454 } else if (!memcmp(buf, "peripheral", 10)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002455 set_bit(B_SESS_VLD, &dev->inputs);
2456 set_bit(ID, &dev->inputs);
2457 work = 1;
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05302458 } else if (!memcmp(buf, "host", 4)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002459 clear_bit(B_SESS_VLD, &dev->inputs);
2460 clear_bit(ID, &dev->inputs);
2461 set_bit(A_BUS_REQ, &dev->inputs);
2462 work = 1;
2463 } else {
2464 pr_info("%s: unknown mode specified\n", __func__);
2465 ret = -EINVAL;
2466 }
2467 spin_unlock_irqrestore(&dev->lock, flags);
2468
2469 if (work) {
2470 wake_lock(&dev->wlock);
2471 queue_work(dev->wq, &dev->sm_work);
2472 }
2473
2474 return ret;
2475}
2476const struct file_operations otgfs_fops = {
2477 .open = otg_open,
2478 .write = otg_mode_write,
2479};
2480
2481#define OTG_INFO_SIZE 512
2482static ssize_t otg_info_read(struct file *file, char __user *ubuf,
2483 size_t count, loff_t *ppos)
2484{
2485 char *buf;
2486 int temp = 0;
2487 int ret;
2488 struct msm_otg *dev = file->private_data;
2489
2490 buf = kzalloc(sizeof(char) * OTG_INFO_SIZE, GFP_KERNEL);
2491 if (!buf)
2492 return -ENOMEM;
2493
2494 temp += scnprintf(buf + temp, OTG_INFO_SIZE - temp,
2495 "OTG State: %s\n"
2496 "OTG Mode: %d\n"
2497 "OTG Inputs: 0x%lx\n"
2498 "Charger Type: %d\n"
2499 "PMIC VBUS Support: %u\n"
2500 "PMIC ID Support: %u\n"
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002501 "USB In SPS: %d\n"
2502 "pre_emphasis_level: 0x%x\n"
2503 "cdr_auto_reset: 0x%x\n"
2504 "hs_drv_amplitude: 0x%x\n"
2505 "se1_gate_state: 0x%x\n"
2506 "swfi_latency: 0x%x\n"
Manu Gautam5143b252012-01-05 19:25:23 -08002507 "PHY Powercollapse: 0x%x\n",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002508 state_string(dev->otg.state),
2509 dev->pdata->otg_mode,
2510 dev->inputs,
2511 atomic_read(&dev->chg_type),
2512 dev->pmic_vbus_notif_supp,
2513 dev->pmic_id_notif_supp,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002514 dev->pdata->usb_in_sps,
2515 dev->pdata->pemp_level,
2516 dev->pdata->cdr_autoreset,
2517 dev->pdata->drv_ampl,
2518 dev->pdata->se1_gating,
2519 dev->pdata->swfi_latency,
Manu Gautam5143b252012-01-05 19:25:23 -08002520 dev->pdata->phy_can_powercollapse);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002521
2522 ret = simple_read_from_buffer(ubuf, count, ppos, buf, temp);
2523
2524 kfree(buf);
2525
2526 return ret;
2527}
2528
2529const struct file_operations otgfs_info_fops = {
2530 .open = otg_open,
2531 .read = otg_info_read,
2532};
2533
2534struct dentry *otg_debug_root;
2535struct dentry *otg_debug_mode;
2536struct dentry *otg_debug_info;
2537#endif
2538
2539static int otg_debugfs_init(struct msm_otg *dev)
2540{
2541#ifdef CONFIG_DEBUG_FS
2542 otg_debug_root = debugfs_create_dir("otg", NULL);
2543 if (!otg_debug_root)
2544 return -ENOENT;
2545
2546 otg_debug_mode = debugfs_create_file("mode", 0222,
2547 otg_debug_root, dev,
2548 &otgfs_fops);
2549 if (!otg_debug_mode)
2550 goto free_root;
2551
2552 otg_debug_info = debugfs_create_file("info", 0444,
2553 otg_debug_root, dev,
2554 &otgfs_info_fops);
2555 if (!otg_debug_info)
2556 goto free_mode;
2557
2558 return 0;
2559
2560free_mode:
2561 debugfs_remove(otg_debug_mode);
2562 otg_debug_mode = NULL;
2563
2564free_root:
2565 debugfs_remove(otg_debug_root);
2566 otg_debug_root = NULL;
2567 return -ENOENT;
2568#endif
2569 return 0;
2570}
2571
2572static void otg_debugfs_cleanup(void)
2573{
2574#ifdef CONFIG_DEBUG_FS
2575 debugfs_remove(otg_debug_info);
2576 debugfs_remove(otg_debug_mode);
2577 debugfs_remove(otg_debug_root);
2578#endif
2579}
2580
2581struct otg_io_access_ops msm_otg_io_ops = {
2582 .read = usb_ulpi_read,
2583 .write = usb_ulpi_write,
2584};
2585
2586static int __init msm_otg_probe(struct platform_device *pdev)
2587{
2588 int ret = 0;
2589 struct resource *res;
2590 struct msm_otg *dev;
2591
2592 dev = kzalloc(sizeof(struct msm_otg), GFP_KERNEL);
2593 if (!dev)
2594 return -ENOMEM;
2595
2596 the_msm_otg = dev;
2597 dev->otg.dev = &pdev->dev;
2598 dev->pdata = pdev->dev.platform_data;
2599
2600 if (!dev->pdata) {
2601 ret = -ENODEV;
2602 goto free_dev;
2603 }
2604
2605#ifdef CONFIG_USB_EHCI_MSM_72K
2606 if (!dev->pdata->vbus_power) {
2607 ret = -ENODEV;
2608 goto free_dev;
2609 } else
2610 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2611
2612#endif
2613
2614
2615 if (dev->pdata->rpc_connect) {
2616 ret = dev->pdata->rpc_connect(1);
2617 pr_debug("%s: rpc_connect(%d)\n", __func__, ret);
2618 if (ret) {
2619 pr_err("%s: rpc connect failed\n", __func__);
2620 ret = -ENODEV;
2621 goto free_dev;
2622 }
2623 }
2624
Manu Gautam5143b252012-01-05 19:25:23 -08002625 dev->alt_core_clk = clk_get(&pdev->dev, "alt_core_clk");
2626 if (IS_ERR(dev->alt_core_clk)) {
2627 pr_err("%s: failed to get alt_core_clk\n", __func__);
2628 ret = PTR_ERR(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002629 goto rpc_fail;
2630 }
Manu Gautam5143b252012-01-05 19:25:23 -08002631 clk_set_rate(dev->alt_core_clk, 60000000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002632
2633 /* pm qos request to prevent apps idle power collapse */
2634 pm_qos_add_request(&dev->pdata->pm_qos_req_dma, PM_QOS_CPU_DMA_LATENCY,
2635 PM_QOS_DEFAULT_VALUE);
2636
Manu Gautam5143b252012-01-05 19:25:23 -08002637 dev->core_clk = clk_get(&pdev->dev, "core_clk");
2638 if (IS_ERR(dev->core_clk)) {
2639 pr_err("%s: failed to get core_clk\n", __func__);
2640 ret = PTR_ERR(dev->core_clk);
2641 goto put_alt_core_clk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002642 }
Manu Gautam5143b252012-01-05 19:25:23 -08002643 /* CORE clk must be running at >60Mhz for correct HSUSB operation
2644 * and USB core cannot tolerate frequency changes on CORE CLK.
2645 * Vote for maximum clk frequency for CORE clock.
2646 */
2647 clk_set_rate(dev->core_clk, INT_MAX);
2648
Manu Gautam28b1bac2012-01-30 16:43:06 +05302649 clk_prepare_enable(dev->core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002650
2651 if (!dev->pdata->pclk_is_hw_gated) {
Manu Gautam5143b252012-01-05 19:25:23 -08002652 dev->iface_clk = clk_get(&pdev->dev, "iface_clk");
2653 if (IS_ERR(dev->iface_clk)) {
2654 pr_err("%s: failed to get abh_clk\n", __func__);
2655 ret = PTR_ERR(dev->iface_clk);
2656 goto put_core_clk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002657 }
Manu Gautam28b1bac2012-01-30 16:43:06 +05302658 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002659 }
2660
2661 if (!dev->pdata->phy_reset) {
Manu Gautam5143b252012-01-05 19:25:23 -08002662 dev->phy_reset_clk = clk_get(&pdev->dev, "phy_clk");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002663 if (IS_ERR(dev->phy_reset_clk)) {
Manu Gautam5143b252012-01-05 19:25:23 -08002664 pr_err("%s: failed to get phy_clk\n", __func__);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002665 ret = PTR_ERR(dev->phy_reset_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002666 goto put_iface_clk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002667 }
2668 }
2669
2670 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2671 if (!res) {
2672 pr_err("%s: failed to get platform resource mem\n", __func__);
2673 ret = -ENODEV;
2674 goto put_phy_clk;
2675 }
2676
2677 dev->regs = ioremap(res->start, resource_size(res));
2678 if (!dev->regs) {
2679 pr_err("%s: ioremap failed\n", __func__);
2680 ret = -ENOMEM;
2681 goto put_phy_clk;
2682 }
2683 dev->irq = platform_get_irq(pdev, 0);
2684 if (!dev->irq) {
2685 pr_err("%s: platform_get_irq failed\n", __func__);
2686 ret = -ENODEV;
2687 goto free_regs;
2688 }
2689 dev->xo_handle = msm_xo_get(MSM_XO_TCXO_D1, "usb");
2690 if (IS_ERR(dev->xo_handle)) {
2691 pr_err(" %s not able to get the handle"
2692 "to vote for TCXO D1 buffer\n", __func__);
2693 ret = PTR_ERR(dev->xo_handle);
2694 goto free_regs;
2695 }
2696
2697 ret = msm_xo_mode_vote(dev->xo_handle, MSM_XO_MODE_ON);
2698 if (ret) {
2699 pr_err("%s failed to vote for TCXO"
2700 "D1 buffer%d\n", __func__, ret);
2701 goto free_xo_handle;
2702 }
2703
2704
2705 msm_otg_init_timer(dev);
2706 INIT_WORK(&dev->sm_work, msm_otg_sm_work);
2707 INIT_WORK(&dev->otg_resume_work, msm_otg_resume_w);
2708 spin_lock_init(&dev->lock);
2709 wake_lock_init(&dev->wlock, WAKE_LOCK_SUSPEND, "msm_otg");
2710
2711 dev->wq = alloc_workqueue("k_otg", WQ_NON_REENTRANT, 0);
2712 if (!dev->wq) {
2713 ret = -ENOMEM;
2714 goto free_wlock;
2715 }
2716
2717 if (dev->pdata->init_gpio) {
2718 ret = dev->pdata->init_gpio(1);
2719 if (ret) {
2720 pr_err("%s: gpio init failed with err:%d\n",
2721 __func__, ret);
2722 goto free_wq;
2723 }
2724 }
2725 /* To reduce phy power consumption and to avoid external LDO
2726 * on the board, PMIC comparators can be used to detect VBUS
2727 * session change.
2728 */
2729 if (dev->pdata->pmic_vbus_notif_init) {
2730 ret = dev->pdata->pmic_vbus_notif_init
2731 (&msm_otg_set_vbus_state, 1);
2732 if (!ret) {
2733 dev->pmic_vbus_notif_supp = 1;
2734 } else if (ret != -ENOTSUPP) {
2735 pr_err("%s: pmic_vbus_notif_init() failed, err:%d\n",
2736 __func__, ret);
2737 goto free_gpio;
2738 }
2739 }
2740
Anji jonnalaae745e92011-11-14 18:34:31 +05302741 if (dev->pdata->phy_id_setup_init) {
2742 ret = dev->pdata->phy_id_setup_init(1);
2743 if (ret) {
2744 pr_err("%s: phy_id_setup_init failed err:%d",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002745 __func__, ret);
2746 goto free_pmic_vbus_notif;
2747 }
2748 }
2749
2750 if (dev->pdata->pmic_vbus_irq)
2751 dev->vbus_on_irq = dev->pdata->pmic_vbus_irq;
2752
2753 /* vote for vddcx, as PHY cannot tolerate vddcx below 1.0V */
2754 if (dev->pdata->init_vddcx) {
2755 ret = dev->pdata->init_vddcx(1);
2756 if (ret) {
2757 pr_err("%s: unable to enable vddcx digital core:%d\n",
2758 __func__, ret);
Anji jonnalaae745e92011-11-14 18:34:31 +05302759 goto free_phy_id_setup;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002760 }
2761 }
2762
2763 if (dev->pdata->ldo_init) {
2764 ret = dev->pdata->ldo_init(1);
2765 if (ret) {
2766 pr_err("%s: ldo_init failed with err:%d\n",
2767 __func__, ret);
2768 goto free_config_vddcx;
2769 }
2770 }
2771
2772 if (dev->pdata->ldo_enable) {
2773 ret = dev->pdata->ldo_enable(1);
2774 if (ret) {
2775 pr_err("%s: ldo_enable failed with err:%d\n",
2776 __func__, ret);
2777 goto free_ldo_init;
2778 }
2779 }
2780
2781
2782 /* ACk all pending interrupts and clear interrupt enable registers */
2783 writel((readl(USB_OTGSC) & ~OTGSC_INTR_MASK), USB_OTGSC);
2784 writel(readl(USB_USBSTS), USB_USBSTS);
2785 writel(0, USB_USBINTR);
2786 /* Ensure that above STOREs are completed before enabling interrupts */
2787 mb();
2788
2789 ret = request_irq(dev->irq, msm_otg_irq, IRQF_SHARED,
2790 "msm_otg", dev);
2791 if (ret) {
2792 pr_err("%s: request irq failed\n", __func__);
2793 goto free_ldo_enable;
2794 }
2795
2796 dev->otg.set_peripheral = msm_otg_set_peripheral;
2797#ifdef CONFIG_USB_EHCI_MSM_72K
2798 dev->otg.set_host = msm_otg_set_host;
2799#endif
2800 dev->otg.set_suspend = msm_otg_set_suspend;
2801 dev->otg.start_hnp = msm_otg_start_hnp;
2802 dev->otg.send_event = msm_otg_send_event;
2803 dev->otg.set_power = msm_otg_set_power;
2804 dev->set_clk = msm_otg_set_clk;
2805 dev->reset = otg_reset;
2806 dev->otg.io_ops = &msm_otg_io_ops;
2807 if (otg_set_transceiver(&dev->otg)) {
2808 WARN_ON(1);
2809 goto free_otg_irq;
2810 }
2811#ifdef CONFIG_USB_MSM_ACA
2812 /* Link doesnt support id_a/b/c interrupts, hence polling
2813 * needs to be done to support ACA charger
2814 */
2815 init_timer(&dev->id_timer);
2816 dev->id_timer.function = msm_otg_id_func;
2817 dev->id_timer.data = (unsigned long) dev;
2818#endif
2819
2820 atomic_set(&dev->chg_type, USB_CHG_TYPE__INVALID);
2821 if (dev->pdata->chg_init && dev->pdata->chg_init(1))
2822 pr_err("%s: chg_init failed\n", __func__);
2823
2824 device_init_wakeup(&pdev->dev, 1);
2825
2826 ret = pm_runtime_set_active(&pdev->dev);
2827 if (ret < 0)
2828 pr_err("%s: pm_runtime: Fail to set active\n", __func__);
2829
2830 ret = 0;
2831 pm_runtime_enable(&pdev->dev);
2832 pm_runtime_get(&pdev->dev);
2833
2834
2835 ret = otg_debugfs_init(dev);
2836 if (ret) {
2837 pr_err("%s: otg_debugfs_init failed\n", __func__);
2838 goto chg_deinit;
2839 }
2840
2841#ifdef CONFIG_USB_OTG
2842 ret = sysfs_create_group(&pdev->dev.kobj, &msm_otg_attr_grp);
2843 if (ret < 0) {
2844 pr_err("%s: Failed to create the sysfs entry\n", __func__);
2845 otg_debugfs_cleanup();
2846 goto chg_deinit;
2847 }
2848#endif
2849
2850
2851 return 0;
2852
2853chg_deinit:
2854 if (dev->pdata->chg_init)
2855 dev->pdata->chg_init(0);
2856free_otg_irq:
2857 free_irq(dev->irq, dev);
2858free_ldo_enable:
2859 if (dev->pdata->ldo_enable)
2860 dev->pdata->ldo_enable(0);
2861 if (dev->pdata->setup_gpio)
2862 dev->pdata->setup_gpio(USB_SWITCH_DISABLE);
2863free_ldo_init:
2864 if (dev->pdata->ldo_init)
2865 dev->pdata->ldo_init(0);
2866free_config_vddcx:
2867 if (dev->pdata->init_vddcx)
2868 dev->pdata->init_vddcx(0);
Anji jonnalaae745e92011-11-14 18:34:31 +05302869free_phy_id_setup:
2870 if (dev->pdata->phy_id_setup_init)
2871 dev->pdata->phy_id_setup_init(0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002872free_pmic_vbus_notif:
2873 if (dev->pdata->pmic_vbus_notif_init && dev->pmic_vbus_notif_supp)
2874 dev->pdata->pmic_vbus_notif_init(&msm_otg_set_vbus_state, 0);
2875free_gpio:
2876 if (dev->pdata->init_gpio)
2877 dev->pdata->init_gpio(0);
2878free_wq:
2879 destroy_workqueue(dev->wq);
2880free_wlock:
2881 wake_lock_destroy(&dev->wlock);
2882free_xo_handle:
2883 msm_xo_put(dev->xo_handle);
2884free_regs:
2885 iounmap(dev->regs);
2886put_phy_clk:
2887 if (dev->phy_reset_clk)
2888 clk_put(dev->phy_reset_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002889put_iface_clk:
2890 if (dev->iface_clk) {
Manu Gautam28b1bac2012-01-30 16:43:06 +05302891 clk_disable_unprepare(dev->iface_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002892 clk_put(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002893 }
Manu Gautam5143b252012-01-05 19:25:23 -08002894put_core_clk:
Manu Gautam28b1bac2012-01-30 16:43:06 +05302895 clk_disable_unprepare(dev->core_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002896 clk_put(dev->core_clk);
2897put_alt_core_clk:
2898 clk_put(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002899rpc_fail:
2900 if (dev->pdata->rpc_connect)
2901 dev->pdata->rpc_connect(0);
2902free_dev:
2903 kfree(dev);
2904 return ret;
2905}
2906
2907static int __exit msm_otg_remove(struct platform_device *pdev)
2908{
2909 struct msm_otg *dev = the_msm_otg;
2910
2911 otg_debugfs_cleanup();
2912#ifdef CONFIG_USB_OTG
2913 sysfs_remove_group(&pdev->dev.kobj, &msm_otg_attr_grp);
2914#endif
2915 destroy_workqueue(dev->wq);
2916 wake_lock_destroy(&dev->wlock);
2917
2918 if (dev->pdata->setup_gpio)
2919 dev->pdata->setup_gpio(USB_SWITCH_DISABLE);
2920
2921 if (dev->pdata->init_vddcx)
2922 dev->pdata->init_vddcx(0);
2923 if (dev->pdata->ldo_enable)
2924 dev->pdata->ldo_enable(0);
2925
2926 if (dev->pdata->ldo_init)
2927 dev->pdata->ldo_init(0);
2928
2929 if (dev->pmic_vbus_notif_supp)
2930 dev->pdata->pmic_vbus_notif_init(&msm_otg_set_vbus_state, 0);
2931
Anji jonnalaae745e92011-11-14 18:34:31 +05302932 if (dev->pdata->phy_id_setup_init)
2933 dev->pdata->phy_id_setup_init(0);
2934
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002935 if (dev->pmic_id_notif_supp)
2936 dev->pdata->pmic_id_notif_init(&msm_otg_set_id_state, 0);
2937
2938#ifdef CONFIG_USB_MSM_ACA
2939 del_timer_sync(&dev->id_timer);
2940#endif
2941 if (dev->pdata->chg_init)
2942 dev->pdata->chg_init(0);
2943 free_irq(dev->irq, pdev);
2944 iounmap(dev->regs);
Manu Gautam28b1bac2012-01-30 16:43:06 +05302945 clk_disable_unprepare(dev->core_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002946 clk_put(dev->core_clk);
2947 if (dev->iface_clk) {
Manu Gautam28b1bac2012-01-30 16:43:06 +05302948 clk_disable_unprepare(dev->iface_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002949 clk_put(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002950 }
Manu Gautam5143b252012-01-05 19:25:23 -08002951 if (dev->alt_core_clk)
2952 clk_put(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002953 if (dev->phy_reset_clk)
2954 clk_put(dev->phy_reset_clk);
2955 if (dev->pdata->rpc_connect)
2956 dev->pdata->rpc_connect(0);
2957 msm_xo_put(dev->xo_handle);
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05302958 pm_qos_remove_request(&dev->pdata->pm_qos_req_dma);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002959
2960 pm_runtime_put(&pdev->dev);
2961 pm_runtime_disable(&pdev->dev);
2962 kfree(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002963 return 0;
2964}
2965
2966static int msm_otg_runtime_suspend(struct device *dev)
2967{
2968 struct msm_otg *otg = the_msm_otg;
2969
2970 dev_dbg(dev, "pm_runtime: suspending...\n");
2971 msm_otg_suspend(otg);
2972 return 0;
2973}
2974
2975static int msm_otg_runtime_resume(struct device *dev)
2976{
2977 struct msm_otg *otg = the_msm_otg;
2978
2979 dev_dbg(dev, "pm_runtime: resuming...\n");
2980 msm_otg_resume(otg);
2981 return 0;
2982}
2983
2984static int msm_otg_runtime_idle(struct device *dev)
2985{
2986 dev_dbg(dev, "pm_runtime: idling...\n");
2987 return 0;
2988}
2989
2990static struct dev_pm_ops msm_otg_dev_pm_ops = {
2991 .runtime_suspend = msm_otg_runtime_suspend,
2992 .runtime_resume = msm_otg_runtime_resume,
2993 .runtime_idle = msm_otg_runtime_idle,
2994};
2995
2996static struct platform_driver msm_otg_driver = {
2997 .remove = __exit_p(msm_otg_remove),
2998 .driver = {
2999 .name = DRIVER_NAME,
3000 .owner = THIS_MODULE,
3001 .pm = &msm_otg_dev_pm_ops,
3002 },
3003};
3004
3005static int __init msm_otg_init(void)
3006{
3007 return platform_driver_probe(&msm_otg_driver, msm_otg_probe);
3008}
3009
3010static void __exit msm_otg_exit(void)
3011{
3012 platform_driver_unregister(&msm_otg_driver);
3013}
3014
3015module_init(msm_otg_init);
3016module_exit(msm_otg_exit);
3017
3018MODULE_LICENSE("GPL v2");
3019MODULE_DESCRIPTION("MSM usb transceiver driver");
3020MODULE_VERSION("1.00");