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