blob: 9a10ff6cc2ac6dc1b7e1ca0dec0d0b377977924b [file] [log] [blame]
Duy Truonge833aca2013-02-12 13:35:08 -08001/* Copyright (c) 2009-2012, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/device.h>
16#include <linux/platform_device.h>
17#include <linux/clk.h>
18#include <linux/interrupt.h>
19#include <linux/err.h>
20#include <linux/delay.h>
21#include <linux/io.h>
22#include <linux/ioport.h>
23#include <linux/pm_runtime.h>
24
25#include <linux/device.h>
Steve Mucklef132c6c2012-06-06 18:30:57 -070026#include <linux/pm_qos.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070027#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"
Steve Mucklef132c6c2012-06-06 18:30:57 -070038static void otg_reset(struct usb_phy *phy, int phy_reset);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070039static 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
Steve Mucklef132c6c2012-06-06 18:30:57 -0700125static int usb_ulpi_write(struct usb_phy *xceiv, u32 val, u32 reg)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700126{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700127 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700128
129 return ulpi_write(dev, val, reg);
130}
131
Steve Mucklef132c6c2012-06-06 18:30:57 -0700132static int usb_ulpi_read(struct usb_phy *xceiv, u32 reg)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700133{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700134 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700135
136 return ulpi_read(dev, reg);
137}
138
139#ifdef CONFIG_USB_EHCI_MSM_72K
140static void enable_idgnd(struct msm_otg *dev)
141{
Anji jonnalaae745e92011-11-14 18:34:31 +0530142 unsigned temp;
143
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700144 /* Do nothing if instead of ID pin, USER controls mode switch */
145 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
146 return;
147
148 ulpi_write(dev, (1<<4), 0x0E);
149 ulpi_write(dev, (1<<4), 0x11);
Anji jonnalaae745e92011-11-14 18:34:31 +0530150 ulpi_write(dev, (1<<0), 0x0B);
151 temp = OTGSC_IDIE | OTGSC_IDPU;
152 writel_relaxed(readl_relaxed(USB_OTGSC) | temp, USB_OTGSC);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700153}
154
155static void disable_idgnd(struct msm_otg *dev)
156{
Anji jonnalaae745e92011-11-14 18:34:31 +0530157 unsigned temp;
158
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700159 /* Do nothing if instead of ID pin, USER controls mode switch */
160 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
161 return;
Anji jonnalaae745e92011-11-14 18:34:31 +0530162 temp = OTGSC_IDIE | OTGSC_IDPU;
163 writel_relaxed(readl_relaxed(USB_OTGSC) & ~temp, USB_OTGSC);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700164 ulpi_write(dev, (1<<4), 0x0F);
165 ulpi_write(dev, (1<<4), 0x12);
Anji jonnalaae745e92011-11-14 18:34:31 +0530166 ulpi_write(dev, (1<<0), 0x0C);
167}
168#else
169static void enable_idgnd(struct msm_otg *dev)
170{
171}
172static void disable_idgnd(struct msm_otg *dev)
173{
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700174}
175#endif
176
177static void enable_idabc(struct msm_otg *dev)
178{
179#ifdef CONFIG_USB_MSM_ACA
180 ulpi_write(dev, (1<<5), 0x0E);
181 ulpi_write(dev, (1<<5), 0x11);
182#endif
183}
184static void disable_idabc(struct msm_otg *dev)
185{
186#ifdef CONFIG_USB_MSM_ACA
187 ulpi_write(dev, (1<<5), 0x0F);
188 ulpi_write(dev, (1<<5), 0x12);
189#endif
190}
191
192static void enable_sess_valid(struct msm_otg *dev)
193{
194 /* Do nothing if instead of ID pin, USER controls mode switch */
195 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
196 return;
197
198 ulpi_write(dev, (1<<2), 0x0E);
199 ulpi_write(dev, (1<<2), 0x11);
200 writel(readl(USB_OTGSC) | OTGSC_BSVIE, USB_OTGSC);
201}
202
203static void disable_sess_valid(struct msm_otg *dev)
204{
205 /* Do nothing if instead of ID pin, USER controls mode switch */
206 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
207 return;
208
209 ulpi_write(dev, (1<<2), 0x0F);
210 ulpi_write(dev, (1<<2), 0x12);
211 writel(readl(USB_OTGSC) & ~OTGSC_BSVIE, USB_OTGSC);
212}
213#ifdef CONFIG_USB_MSM_ACA
214static void set_aca_id_inputs(struct msm_otg *dev)
215{
216 u8 phy_ints;
217
218 phy_ints = ulpi_read(dev, 0x13);
219 if (phy_ints == -ETIMEDOUT)
220 return;
221
222 pr_debug("phy_ints = %x\n", phy_ints);
223 clear_bit(ID_A, &dev->inputs);
224 clear_bit(ID_B, &dev->inputs);
225 clear_bit(ID_C, &dev->inputs);
226 if (phy_id_state_a(phy_ints)) {
227 pr_debug("ID_A set\n");
228 set_bit(ID_A, &dev->inputs);
229 set_bit(A_BUS_REQ, &dev->inputs);
230 } else if (phy_id_state_b(phy_ints)) {
231 pr_debug("ID_B set\n");
232 set_bit(ID_B, &dev->inputs);
233 } else if (phy_id_state_c(phy_ints)) {
234 pr_debug("ID_C set\n");
235 set_bit(ID_C, &dev->inputs);
236 }
237 if (is_b_sess_vld())
238 set_bit(B_SESS_VLD, &dev->inputs);
239 else
240 clear_bit(B_SESS_VLD, &dev->inputs);
241}
242#define get_aca_bmaxpower(dev) (dev->b_max_power)
243#define set_aca_bmaxpower(dev, power) (dev->b_max_power = power)
244#else
Anji jonnalaae745e92011-11-14 18:34:31 +0530245static void set_aca_id_inputs(struct msm_otg *dev)
246{
247}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700248#define get_aca_bmaxpower(dev) 0
249#define set_aca_bmaxpower(dev, power)
250#endif
251static inline void set_pre_emphasis_level(struct msm_otg *dev)
252{
253 unsigned res = 0;
254
255 if (!dev->pdata || dev->pdata->pemp_level == PRE_EMPHASIS_DEFAULT)
256 return;
257
258 res = ulpi_read(dev, ULPI_CONFIG_REG3);
259 res &= ~(ULPI_PRE_EMPHASIS_MASK);
260 if (dev->pdata->pemp_level != PRE_EMPHASIS_DISABLE)
261 res |= dev->pdata->pemp_level;
262 ulpi_write(dev, res, ULPI_CONFIG_REG3);
263}
264
265static inline void set_hsdrv_slope(struct msm_otg *dev)
266{
267 unsigned res = 0;
268
269 if (!dev->pdata || dev->pdata->hsdrvslope == HS_DRV_SLOPE_DEFAULT)
270 return;
271
272 res = ulpi_read(dev, ULPI_CONFIG_REG3);
273 res &= ~(ULPI_HSDRVSLOPE_MASK);
274 res |= (dev->pdata->hsdrvslope & ULPI_HSDRVSLOPE_MASK);
275 ulpi_write(dev, res, ULPI_CONFIG_REG3);
276}
277
278static inline void set_cdr_auto_reset(struct msm_otg *dev)
279{
280 unsigned res = 0;
281
282 if (!dev->pdata || dev->pdata->cdr_autoreset == CDR_AUTO_RESET_DEFAULT)
283 return;
284
285 res = ulpi_read(dev, ULPI_DIGOUT_CTRL);
286 if (dev->pdata->cdr_autoreset == CDR_AUTO_RESET_ENABLE)
287 res &= ~ULPI_CDR_AUTORESET;
288 else
289 res |= ULPI_CDR_AUTORESET;
290 ulpi_write(dev, res, ULPI_DIGOUT_CTRL);
291}
292
293static inline void set_se1_gating(struct msm_otg *dev)
294{
295 unsigned res = 0;
296
297 if (!dev->pdata || dev->pdata->se1_gating == SE1_GATING_DEFAULT)
298 return;
299
300 res = ulpi_read(dev, ULPI_DIGOUT_CTRL);
301 if (dev->pdata->se1_gating == SE1_GATING_ENABLE)
302 res &= ~ULPI_SE1_GATE;
303 else
304 res |= ULPI_SE1_GATE;
305 ulpi_write(dev, res, ULPI_DIGOUT_CTRL);
306}
307static inline void set_driver_amplitude(struct msm_otg *dev)
308{
309 unsigned res = 0;
310
311 if (!dev->pdata || dev->pdata->drv_ampl == HS_DRV_AMPLITUDE_DEFAULT)
312 return;
313
314 res = ulpi_read(dev, ULPI_CONFIG_REG2);
315 res &= ~ULPI_DRV_AMPL_MASK;
316 if (dev->pdata->drv_ampl != HS_DRV_AMPLITUDE_ZERO_PERCENT)
317 res |= dev->pdata->drv_ampl;
318 ulpi_write(dev, res, ULPI_CONFIG_REG2);
319}
320
321static const char *state_string(enum usb_otg_state state)
322{
323 switch (state) {
324 case OTG_STATE_A_IDLE: return "a_idle";
325 case OTG_STATE_A_WAIT_VRISE: return "a_wait_vrise";
326 case OTG_STATE_A_WAIT_BCON: return "a_wait_bcon";
327 case OTG_STATE_A_HOST: return "a_host";
328 case OTG_STATE_A_SUSPEND: return "a_suspend";
329 case OTG_STATE_A_PERIPHERAL: return "a_peripheral";
330 case OTG_STATE_A_WAIT_VFALL: return "a_wait_vfall";
331 case OTG_STATE_A_VBUS_ERR: return "a_vbus_err";
332 case OTG_STATE_B_IDLE: return "b_idle";
333 case OTG_STATE_B_SRP_INIT: return "b_srp_init";
334 case OTG_STATE_B_PERIPHERAL: return "b_peripheral";
335 case OTG_STATE_B_WAIT_ACON: return "b_wait_acon";
336 case OTG_STATE_B_HOST: return "b_host";
337 default: return "UNDEFINED";
338 }
339}
340
341static const char *timer_string(int bit)
342{
343 switch (bit) {
344 case A_WAIT_VRISE: return "a_wait_vrise";
345 case A_WAIT_VFALL: return "a_wait_vfall";
346 case B_SRP_FAIL: return "b_srp_fail";
347 case A_WAIT_BCON: return "a_wait_bcon";
348 case A_AIDL_BDIS: return "a_aidl_bdis";
349 case A_BIDL_ADIS: return "a_bidl_adis";
350 case B_ASE0_BRST: return "b_ase0_brst";
351 default: return "UNDEFINED";
352 }
353}
354
355/* Prevent idle power collapse(pc) while operating in peripheral mode */
356static void otg_pm_qos_update_latency(struct msm_otg *dev, int vote)
357{
358 struct msm_otg_platform_data *pdata = dev->pdata;
359 u32 swfi_latency = 0;
360
361 if (pdata)
362 swfi_latency = pdata->swfi_latency + 1;
363
364 if (vote)
365 pm_qos_update_request(&pdata->pm_qos_req_dma,
366 swfi_latency);
367 else
368 pm_qos_update_request(&pdata->pm_qos_req_dma,
369 PM_QOS_DEFAULT_VALUE);
370}
371
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700372/* Controller gives interrupt for every 1 mesc if 1MSIE is set in OTGSC.
373 * This interrupt can be used as a timer source and OTG timers can be
374 * implemented. But hrtimers on MSM hardware can give atleast 1/32 KHZ
375 * precision. This precision is more than enough for OTG timers.
376 */
377static enum hrtimer_restart msm_otg_timer_func(struct hrtimer *_timer)
378{
379 struct msm_otg *dev = container_of(_timer, struct msm_otg, timer);
380
381 /* Phy lockup issues are observed when VBUS Valid interrupt is
382 * enabled. Hence set A_VBUS_VLD upon timer exipration.
383 */
384 if (dev->active_tmout == A_WAIT_VRISE)
385 set_bit(A_VBUS_VLD, &dev->inputs);
386 else
387 set_bit(dev->active_tmout, &dev->tmouts);
388
389 pr_debug("expired %s timer\n", timer_string(dev->active_tmout));
390 queue_work(dev->wq, &dev->sm_work);
391 return HRTIMER_NORESTART;
392}
393
394static void msm_otg_del_timer(struct msm_otg *dev)
395{
396 int bit = dev->active_tmout;
397
398 pr_debug("deleting %s timer. remaining %lld msec \n", timer_string(bit),
399 div_s64(ktime_to_us(hrtimer_get_remaining(&dev->timer)),
400 1000));
401 hrtimer_cancel(&dev->timer);
402 clear_bit(bit, &dev->tmouts);
403}
404
405static void msm_otg_start_timer(struct msm_otg *dev, int time, int bit)
406{
407 clear_bit(bit, &dev->tmouts);
408 dev->active_tmout = bit;
409 pr_debug("starting %s timer\n", timer_string(bit));
410 hrtimer_start(&dev->timer,
411 ktime_set(time / 1000, (time % 1000) * 1000000),
412 HRTIMER_MODE_REL);
413}
414
415/* No two otg timers run in parallel. So one hrtimer is sufficient */
416static void msm_otg_init_timer(struct msm_otg *dev)
417{
418 hrtimer_init(&dev->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
419 dev->timer.function = msm_otg_timer_func;
420}
421
422static const char *event_string(enum usb_otg_event event)
423{
424 switch (event) {
425 case OTG_EVENT_DEV_CONN_TMOUT:
426 return "DEV_CONN_TMOUT";
427 case OTG_EVENT_NO_RESP_FOR_HNP_ENABLE:
428 return "NO_RESP_FOR_HNP_ENABLE";
429 case OTG_EVENT_HUB_NOT_SUPPORTED:
430 return "HUB_NOT_SUPPORTED";
431 case OTG_EVENT_DEV_NOT_SUPPORTED:
432 return "DEV_NOT_SUPPORTED,";
433 case OTG_EVENT_HNP_FAILED:
434 return "HNP_FAILED";
435 case OTG_EVENT_NO_RESP_FOR_SRP:
436 return "NO_RESP_FOR_SRP";
437 default:
438 return "UNDEFINED";
439 }
440}
441
Steve Mucklef132c6c2012-06-06 18:30:57 -0700442static int msm_otg_send_event(struct usb_otg *otg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700443 enum usb_otg_event event)
444{
445 char module_name[16];
446 char udev_event[128];
447 char *envp[] = { module_name, udev_event, NULL };
448 int ret;
449
450 pr_debug("sending %s event\n", event_string(event));
451
452 snprintf(module_name, 16, "MODULE=%s", DRIVER_NAME);
453 snprintf(udev_event, 128, "EVENT=%s", event_string(event));
Steve Mucklef132c6c2012-06-06 18:30:57 -0700454 ret = kobject_uevent_env(&otg->phy->dev->kobj, KOBJ_CHANGE, envp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700455 if (ret < 0)
456 pr_info("uevent sending failed with ret = %d\n", ret);
457 return ret;
458}
459
Steve Mucklef132c6c2012-06-06 18:30:57 -0700460static int msm_otg_start_hnp(struct usb_otg *otg)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700461{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700462 struct msm_otg *dev = container_of(otg->phy, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700463 enum usb_otg_state state;
464 unsigned long flags;
465
466 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -0700467 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700468 spin_unlock_irqrestore(&dev->lock, flags);
469
470 if (state != OTG_STATE_A_HOST) {
471 pr_err("HNP can not be initiated in %s state\n",
472 state_string(state));
473 return -EINVAL;
474 }
475
476 pr_debug("A-Host: HNP initiated\n");
477 clear_bit(A_BUS_REQ, &dev->inputs);
478 wake_lock(&dev->wlock);
479 queue_work(dev->wq, &dev->sm_work);
480 return 0;
481}
482
Steve Mucklef132c6c2012-06-06 18:30:57 -0700483static int msm_otg_start_srp(struct usb_otg *otg)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700484{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700485 struct msm_otg *dev = container_of(otg->phy, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700486 u32 val;
487 int ret = 0;
488 enum usb_otg_state state;
489 unsigned long flags;
490
491 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -0700492 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700493 spin_unlock_irqrestore(&dev->lock, flags);
494
495 if (state != OTG_STATE_B_IDLE) {
496 pr_err("SRP can not be initiated in %s state\n",
497 state_string(state));
498 ret = -EINVAL;
499 goto out;
500 }
501
502 if ((jiffies - dev->b_last_se0_sess) < msecs_to_jiffies(TB_SRP_INIT)) {
503 pr_debug("initial conditions of SRP are not met. Try again"
504 "after some time\n");
505 ret = -EAGAIN;
506 goto out;
507 }
508
509 /* Harware auto assist data pulsing: Data pulse is given
510 * for 7msec; wait for vbus
511 */
512 val = readl(USB_OTGSC);
513 writel((val & ~OTGSC_INTR_STS_MASK) | OTGSC_HADP, USB_OTGSC);
514
515 /* VBUS plusing is obsoleted in OTG 2.0 supplement */
516out:
517 return ret;
518}
519
Steve Mucklef132c6c2012-06-06 18:30:57 -0700520static int msm_otg_set_power(struct usb_phy *xceiv, unsigned mA)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700521{
522 static enum chg_type curr_chg = USB_CHG_TYPE__INVALID;
Steve Mucklef132c6c2012-06-06 18:30:57 -0700523 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700524 struct msm_otg_platform_data *pdata = dev->pdata;
525 enum chg_type new_chg = atomic_read(&dev->chg_type);
526 unsigned charge = mA;
527
528 /* Call chg_connected only if the charger has changed */
529 if (new_chg != curr_chg && pdata->chg_connected) {
530 curr_chg = new_chg;
531 pdata->chg_connected(new_chg);
532 }
533
534 /* Always use USB_IDCHG_MAX for charging in ID_B and ID_C */
535 if (test_bit(ID_C, &dev->inputs) ||
536 test_bit(ID_B, &dev->inputs))
537 charge = USB_IDCHG_MAX;
538
539 pr_debug("Charging with %dmA current\n", charge);
540 /* Call vbus_draw only if the charger is of known type and also
541 * ignore request to stop charging as a result of suspend interrupt
542 * when wall-charger is used.
543 */
544 if (pdata->chg_vbus_draw && new_chg != USB_CHG_TYPE__INVALID &&
545 (charge || new_chg != USB_CHG_TYPE__WALLCHARGER))
546 pdata->chg_vbus_draw(charge);
547
548 if (new_chg == USB_CHG_TYPE__WALLCHARGER) {
549 wake_lock(&dev->wlock);
550 queue_work(dev->wq, &dev->sm_work);
551 }
552
553 return 0;
554}
555
Steve Mucklef132c6c2012-06-06 18:30:57 -0700556static int msm_otg_set_clk(struct usb_phy *xceiv, int on)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700557{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700558 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700559
560 if (!dev || (dev != the_msm_otg))
561 return -ENODEV;
562
563 if (on)
564 /* enable clocks */
Manu Gautam28b1bac2012-01-30 16:43:06 +0530565 clk_prepare_enable(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700566 else
Manu Gautam28b1bac2012-01-30 16:43:06 +0530567 clk_disable_unprepare(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700568
569 return 0;
570}
Steve Mucklef132c6c2012-06-06 18:30:57 -0700571static void msm_otg_start_peripheral(struct usb_otg *otg, int on)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700572{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700573 struct msm_otg *dev = container_of(otg->phy, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700574 struct msm_otg_platform_data *pdata = dev->pdata;
575
Steve Mucklef132c6c2012-06-06 18:30:57 -0700576 if (!otg->gadget)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700577 return;
578
579 if (on) {
580 if (pdata->setup_gpio)
581 pdata->setup_gpio(USB_SWITCH_PERIPHERAL);
582 /* vote for minimum dma_latency to prevent idle
583 * power collapse(pc) while running in peripheral mode.
584 */
585 otg_pm_qos_update_latency(dev, 1);
586
587 /* increment the clk reference count so that
588 * it would be still on when disabled from
589 * low power mode routine
590 */
591 if (dev->pdata->pclk_required_during_lpm)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530592 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700593
Steve Mucklef132c6c2012-06-06 18:30:57 -0700594 usb_gadget_vbus_connect(otg->gadget);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700595 } else {
596 atomic_set(&dev->chg_type, USB_CHG_TYPE__INVALID);
Steve Mucklef132c6c2012-06-06 18:30:57 -0700597 usb_gadget_vbus_disconnect(otg->gadget);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700598
599 /* decrement the clk reference count so that
600 * it would be off when disabled from
601 * low power mode routine
602 */
603 if (dev->pdata->pclk_required_during_lpm)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530604 clk_disable_unprepare(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700605
606 otg_pm_qos_update_latency(dev, 0);
607 if (pdata->setup_gpio)
608 pdata->setup_gpio(USB_SWITCH_DISABLE);
609 }
610}
611
Steve Mucklef132c6c2012-06-06 18:30:57 -0700612static void msm_otg_start_host(struct usb_otg *otg, int on)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700613{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700614 struct msm_otg *dev = container_of(otg->phy, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700615 struct msm_otg_platform_data *pdata = dev->pdata;
616
Steve Mucklef132c6c2012-06-06 18:30:57 -0700617 if (!otg->host)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700618 return;
619
620 if (dev->start_host) {
621 /* Some targets, e.g. ST1.5, use GPIO to choose b/w connector */
622 if (on && pdata->setup_gpio)
623 pdata->setup_gpio(USB_SWITCH_HOST);
624
625 /* increment or decrement the clk reference count
626 * to avoid usb h/w lockup issues when low power
627 * mode is initiated and vbus is on.
628 */
629 if (dev->pdata->pclk_required_during_lpm) {
630 if (on)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530631 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700632 else
Manu Gautam28b1bac2012-01-30 16:43:06 +0530633 clk_disable_unprepare(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700634 }
635
Steve Mucklef132c6c2012-06-06 18:30:57 -0700636 dev->start_host(otg->host, on);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700637
638 if (!on && pdata->setup_gpio)
639 pdata->setup_gpio(USB_SWITCH_DISABLE);
640 }
641}
642
643static int msm_otg_suspend(struct msm_otg *dev)
644{
645 unsigned long timeout;
646 bool host_bus_suspend;
647 unsigned ret;
648 enum chg_type chg_type = atomic_read(&dev->chg_type);
649 unsigned long flags;
650
651 disable_irq(dev->irq);
652 if (atomic_read(&dev->in_lpm))
653 goto out;
654#ifdef CONFIG_USB_MSM_ACA
655 /*
656 * ACA interrupts are disabled before entering into LPM.
657 * If LPM is allowed in host mode with accessory charger
658 * connected or only accessory charger is connected,
659 * there is a chance that charger is removed and we will
660 * not know about it.
661 *
662 * REVISIT
663 *
664 * Allowing LPM in case of gadget bus suspend is tricky.
665 * Bus suspend can happen in two states.
666 * 1. ID_float: Allowing LPM has pros and cons. If LPM is allowed
667 * and accessory charger is connected, we miss ID_float --> ID_C
668 * transition where we could draw large amount of current
669 * compared to the suspend current.
670 * 2. ID_C: We can not allow LPM. If accessory charger is removed
671 * we should not draw more than what host could supply which will
672 * be less compared to accessory charger.
673 *
674 * For simplicity, LPM is not allowed in bus suspend.
675 */
676#ifndef CONFIG_USB_MSM_STANDARD_ACA
677 /*
678 * RID_A and IdGnd states are only possible with standard ACA. We can
679 * exit from low power mode with !BSV or IdGnd interrupt. Hence LPM
680 * is allowed.
681 */
682 if ((test_bit(ID, &dev->inputs) && test_bit(B_SESS_VLD, &dev->inputs) &&
683 chg_type != USB_CHG_TYPE__WALLCHARGER) ||
684 test_bit(ID_A, &dev->inputs))
685 goto out;
686#endif
687 /* Disable ID_abc interrupts else it causes spurious interrupt */
688 disable_idabc(dev);
689#endif
690 ulpi_read(dev, 0x14);/* clear PHY interrupt latch register */
691
692 /*
693 * Turn on PHY comparators if,
694 * 1. USB wall charger is connected (bus suspend is not supported)
695 * 2. Host bus suspend
696 * 3. host is supported, but, id is not routed to pmic
697 * 4. peripheral is supported, but, vbus is not routed to pmic
698 */
Steve Mucklef132c6c2012-06-06 18:30:57 -0700699 host_bus_suspend = dev->phy.otg->host && is_host();
Anji jonnalaae745e92011-11-14 18:34:31 +0530700
701 /*
702 * Configure the PMIC ID only in case of cable disconnect.
703 * PMIC doesn't generate interrupt for ID_GND to ID_A
704 * transistion. hence use the PHY ID cricuit.
705 */
706 if (dev->pdata->pmic_id_notif_init && !host_bus_suspend &&
707 !test_bit(ID_A, &dev->inputs)) {
708 disable_idgnd(dev);
709 ret = dev->pdata->pmic_id_notif_init(
710 &msm_otg_set_id_state, 1);
711 if (!ret) {
712 dev->pmic_id_notif_supp = 1;
713 if (dev->pdata->pmic_id_irq)
714 dev->id_irq = dev->pdata->pmic_id_irq;
715 } else if (ret == -ENOTSUPP) {
716 pr_debug("%s:USB ID is not routed to pmic",
717 __func__);
718 enable_idgnd(dev);
719 } else {
720 pr_err("%s: pmic_id_ notif_init failed err:%d",
721 __func__, ret);
722 }
723 }
724
Steve Mucklef132c6c2012-06-06 18:30:57 -0700725 if ((dev->phy.otg->gadget && chg_type == USB_CHG_TYPE__WALLCHARGER) ||
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700726 host_bus_suspend ||
Steve Mucklef132c6c2012-06-06 18:30:57 -0700727 (dev->phy.otg->host && !dev->pmic_id_notif_supp) ||
728 (dev->phy.otg->gadget && !dev->pmic_vbus_notif_supp)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700729 ulpi_write(dev, 0x01, 0x30);
730 }
731
732 ulpi_write(dev, 0x08, 0x09);/* turn off PLL on integrated phy */
733
734 timeout = jiffies + msecs_to_jiffies(500);
735 disable_phy_clk();
736 while (!is_phy_clk_disabled()) {
737 if (time_after(jiffies, timeout)) {
738 pr_err("%s: Unable to suspend phy\n", __func__);
739 /*
740 * Start otg state machine in default state upon
741 * phy suspend failure*/
742 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -0700743 dev->phy.state = OTG_STATE_UNDEFINED;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700744 spin_unlock_irqrestore(&dev->lock, flags);
745 queue_work(dev->wq, &dev->sm_work);
746 goto out;
747 }
748 msleep(1);
749 /* check if there are any pending interrupts*/
750 if (((readl(USB_OTGSC) & OTGSC_INTR_MASK) >> 8) &
751 readl(USB_OTGSC)) {
752 enable_idabc(dev);
753 goto out;
754 }
755 }
756
757 writel(readl(USB_USBCMD) | ASYNC_INTR_CTRL | ULPI_STP_CTRL, USB_USBCMD);
758 /* Ensure that above operation is completed before turning off clocks */
759 mb();
760
Manu Gautam5143b252012-01-05 19:25:23 -0800761 if (dev->iface_clk)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530762 clk_disable_unprepare(dev->iface_clk);
Manu Gautam5143b252012-01-05 19:25:23 -0800763
Manu Gautam28b1bac2012-01-30 16:43:06 +0530764 clk_disable_unprepare(dev->core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700765 /* usb phy no more require TCXO clock, hence vote for TCXO disable*/
766 ret = msm_xo_mode_vote(dev->xo_handle, MSM_XO_MODE_OFF);
767 if (ret)
768 pr_err("%s failed to devote for"
769 "TCXO D1 buffer%d\n", __func__, ret);
770
Steve Mucklef132c6c2012-06-06 18:30:57 -0700771 if (device_may_wakeup(dev->phy.dev)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700772 enable_irq_wake(dev->irq);
773 if (dev->vbus_on_irq)
774 enable_irq_wake(dev->vbus_on_irq);
Anji jonnalaeb9e60d2011-10-05 12:19:46 +0530775 if (dev->id_irq)
776 enable_irq_wake(dev->id_irq);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700777 }
778
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700779 atomic_set(&dev->in_lpm, 1);
780
Anji jonnala3498c472011-11-04 13:30:14 +0530781 /*
782 * TODO: put regulators in low power mode by assuming that
783 * regulators are brought back to active state before PHY
784 * becomes active. But this assumption becomes wrong in case of
785 * ACA charger where PHY itself will generate the wakeup
786 * interrupt. This creates a small window where PHY regulators
787 * are in LPM but PHY is in active state and this patch assumes
788 * that there is no harm with this. Till hw folks confirms this
789 * put regulators in lpm.
790 */
Anji jonnalaae745e92011-11-14 18:34:31 +0530791 if (!host_bus_suspend && dev->pmic_vbus_notif_supp &&
792 !test_bit(ID_A, &dev->inputs)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700793 pr_debug("phy can power collapse: (%d)\n",
794 can_phy_power_collapse(dev));
795 if (can_phy_power_collapse(dev) && dev->pdata->ldo_enable) {
796 pr_debug("disabling the regulators\n");
797 dev->pdata->ldo_enable(0);
798 }
799 }
800
801 /* phy can interrupts when vddcx is at 0.75, so irrespective
802 * of pmic notification support, configure vddcx @0.75
803 */
804 if (dev->pdata->config_vddcx)
805 dev->pdata->config_vddcx(0);
806 pr_info("%s: usb in low power mode\n", __func__);
807
808out:
809 enable_irq(dev->irq);
810
811 return 0;
812}
813
814static int msm_otg_resume(struct msm_otg *dev)
815{
816 unsigned temp;
817 unsigned ret;
818
819 if (!atomic_read(&dev->in_lpm))
820 return 0;
821 /* vote for vddcx, as PHY cannot tolerate vddcx below 1.0V */
822 if (dev->pdata->config_vddcx) {
823 ret = dev->pdata->config_vddcx(1);
824 if (ret) {
825 pr_err("%s: unable to enable vddcx digital core:%d\n",
826 __func__, ret);
827 }
828 }
829 if (dev->pdata->ldo_set_voltage)
830 dev->pdata->ldo_set_voltage(3400);
831
832 /* Vote for TCXO when waking up the phy */
833 ret = msm_xo_mode_vote(dev->xo_handle, MSM_XO_MODE_ON);
834 if (ret)
835 pr_err("%s failed to vote for"
836 "TCXO D1 buffer%d\n", __func__, ret);
837
Manu Gautam28b1bac2012-01-30 16:43:06 +0530838 clk_prepare_enable(dev->core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700839
Manu Gautam5143b252012-01-05 19:25:23 -0800840 if (dev->iface_clk)
Manu Gautam28b1bac2012-01-30 16:43:06 +0530841 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700842
843 temp = readl(USB_USBCMD);
844 temp &= ~ASYNC_INTR_CTRL;
845 temp &= ~ULPI_STP_CTRL;
846 writel(temp, USB_USBCMD);
847
Steve Mucklef132c6c2012-06-06 18:30:57 -0700848 if (device_may_wakeup(dev->phy.dev)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700849 disable_irq_wake(dev->irq);
850 if (dev->vbus_on_irq)
851 disable_irq_wake(dev->vbus_on_irq);
Anji jonnalaeb9e60d2011-10-05 12:19:46 +0530852 if (dev->id_irq)
853 disable_irq_wake(dev->id_irq);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700854 }
855
856 atomic_set(&dev->in_lpm, 0);
857
858 pr_info("%s: usb exited from low power mode\n", __func__);
859
860 return 0;
861}
862
863static void msm_otg_get_resume(struct msm_otg *dev)
864{
865#ifdef CONFIG_PM_RUNTIME
Steve Mucklef132c6c2012-06-06 18:30:57 -0700866 pm_runtime_get_noresume(dev->phy.dev);
867 pm_runtime_resume(dev->phy.dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700868#else
869 msm_otg_resume(dev);
870#endif
871}
872
873static void msm_otg_put_suspend(struct msm_otg *dev)
874{
875#ifdef CONFIG_PM_RUNTIME
Steve Mucklef132c6c2012-06-06 18:30:57 -0700876 pm_runtime_put_sync(dev->phy.dev);
Pavankumar Kondetidc60f122011-09-13 11:17:16 +0530877 if (!atomic_read(&dev->in_lpm))
Steve Mucklef132c6c2012-06-06 18:30:57 -0700878 pm_runtime_get_sync(dev->phy.dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700879#else
880 msm_otg_suspend(dev);
881#endif
882}
883
884static void msm_otg_resume_w(struct work_struct *w)
885{
886 struct msm_otg *dev = container_of(w, struct msm_otg, otg_resume_work);
887 unsigned long timeout;
888
Anji jonnala3498c472011-11-04 13:30:14 +0530889 if (can_phy_power_collapse(dev) && dev->pdata->ldo_enable)
890 dev->pdata->ldo_enable(1);
891
Steve Mucklef132c6c2012-06-06 18:30:57 -0700892 if (pm_runtime_enabled(dev->phy.dev)) {
Chiranjeevi Velempatid515ac12012-05-22 12:08:13 +0530893 msm_otg_get_resume(dev);
894 } else {
Steve Mucklef132c6c2012-06-06 18:30:57 -0700895 pm_runtime_get_noresume(dev->phy.dev);
Chiranjeevi Velempatid515ac12012-05-22 12:08:13 +0530896 msm_otg_resume(dev);
Steve Mucklef132c6c2012-06-06 18:30:57 -0700897 pm_runtime_set_active(dev->phy.dev);
Chiranjeevi Velempatid515ac12012-05-22 12:08:13 +0530898 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700899
900 if (!is_phy_clk_disabled())
901 goto phy_resumed;
902
903 timeout = jiffies + usecs_to_jiffies(100);
904 enable_phy_clk();
905 while (is_phy_clk_disabled() || !is_phy_active()) {
906 if (time_after(jiffies, timeout)) {
907 pr_err("%s: Unable to wakeup phy. is_phy_active: %x\n",
908 __func__, !!is_phy_active());
909 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -0700910 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700911 break;
912 }
913 udelay(10);
914 }
915
916phy_resumed:
Anji jonnalaae745e92011-11-14 18:34:31 +0530917 /*
918 * It is observed that BSVIS may get set immediatly
919 * after PHY becomes active upon micro-B cable connect.
920 * But BSVIS might get cleared by below enable_idgnd
921 * function which causes hw to not generate the BSV interrupt.
922 * Hence check for BSV interrupt explictly and schedule the
923 * work.
924 */
925 if (readl_relaxed(USB_OTGSC) & OTGSC_BSVIS) {
926 set_bit(B_SESS_VLD, &dev->inputs);
927 queue_work(dev->wq, &dev->sm_work);
928 }
929 if (dev->pmic_id_notif_supp) {
930 dev->pdata->pmic_id_notif_init(&msm_otg_set_id_state, 0);
931 dev->pmic_id_notif_supp = 0;
932 enable_idgnd(dev);
933 }
934
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700935 /* Enable Idabc interrupts as these were disabled before entering LPM */
936 enable_idabc(dev);
937
Anji jonnalaae745e92011-11-14 18:34:31 +0530938 /*
939 * There is corner case where host won't be resumed
940 * while transitioning from ID_GND to ID_A. In that
941 * IDGND might have cleared and ID_A might not have updated
942 * yet. Hence update the ACA states explicitly.
943 */
944 set_aca_id_inputs(dev);
945
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700946 /* If resume signalling finishes before lpm exit, PCD is not set in
947 * USBSTS register. Drive resume signal to the downstream device now
948 * so that host driver can process the upcoming port change interrupt.*/
949 if (is_host() || test_bit(ID_A, &dev->inputs)) {
950 writel(readl(USB_PORTSC) | PORTSC_FPR, USB_PORTSC);
Steve Mucklef132c6c2012-06-06 18:30:57 -0700951 msm_otg_start_host(dev->phy.otg, REQUEST_RESUME);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700952 }
953
James Sullins4f526d22014-11-24 20:18:28 -0600954 if (!work_pending(&dev->sm_work) && !hrtimer_active(&dev->timer) &&
955 !work_pending(&dev->otg_resume_work)) {
956 wake_lock_timeout(&dev->wlock, msecs_to_jiffies(2000));
957 }
958
James Sullins96c1b142014-11-24 20:18:28 -0600959 if (!work_pending(&dev->sm_work) && !hrtimer_active(&dev->timer) &&
960 !work_pending(&dev->otg_resume_work)) {
961 wake_lock_timeout(&dev->wlock, msecs_to_jiffies(2000));
962 }
963
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700964 /* Enable irq which was disabled before scheduling this work.
965 * But don't release wake_lock, as we got async interrupt and
966 * there will be some work pending for OTG state machine.
967 */
968 enable_irq(dev->irq);
969}
970
Steve Mucklef132c6c2012-06-06 18:30:57 -0700971static int msm_otg_set_suspend(struct usb_phy *xceiv, int suspend)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700972{
Steve Mucklef132c6c2012-06-06 18:30:57 -0700973 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700974 enum usb_otg_state state;
975 unsigned long flags;
976
977 if (!dev || (dev != the_msm_otg))
978 return -ENODEV;
979
980 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -0700981 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700982 spin_unlock_irqrestore(&dev->lock, flags);
983
984 pr_debug("suspend request in state: %s\n",
985 state_string(state));
986
987 if (suspend) {
988 switch (state) {
989#ifndef CONFIG_MSM_OTG_ENABLE_A_WAIT_BCON_TIMEOUT
990 case OTG_STATE_A_WAIT_BCON:
991 if (test_bit(ID_A, &dev->inputs))
992 msm_otg_set_power(xceiv, USB_IDCHG_MIN - 100);
993 msm_otg_put_suspend(dev);
994 break;
995#endif
996 case OTG_STATE_A_HOST:
997 clear_bit(A_BUS_REQ, &dev->inputs);
998 wake_lock(&dev->wlock);
999 queue_work(dev->wq, &dev->sm_work);
1000 break;
1001 case OTG_STATE_B_PERIPHERAL:
Steve Mucklef132c6c2012-06-06 18:30:57 -07001002 if (xceiv->otg->gadget->b_hnp_enable) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001003 set_bit(A_BUS_SUSPEND, &dev->inputs);
1004 set_bit(B_BUS_REQ, &dev->inputs);
1005 wake_lock(&dev->wlock);
1006 queue_work(dev->wq, &dev->sm_work);
1007 }
1008 break;
1009 case OTG_STATE_A_PERIPHERAL:
1010 msm_otg_start_timer(dev, TA_BIDL_ADIS,
1011 A_BIDL_ADIS);
1012 break;
1013 default:
1014 break;
1015 }
1016 } else {
1017 unsigned long timeout;
1018
1019 switch (state) {
1020 case OTG_STATE_A_PERIPHERAL:
1021 /* A-peripheral observed activity on bus.
1022 * clear A_BIDL_ADIS timer.
1023 */
1024 msm_otg_del_timer(dev);
1025 break;
1026 case OTG_STATE_A_SUSPEND:
1027 /* Remote wakeup or resume */
1028 set_bit(A_BUS_REQ, &dev->inputs);
1029 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001030 dev->phy.state = OTG_STATE_A_HOST;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001031 spin_unlock_irqrestore(&dev->lock, flags);
1032 if (test_bit(ID_A, &dev->inputs) &&
1033 (get_aca_bmaxpower(dev) < USB_IDCHG_MIN))
1034 msm_otg_set_power(xceiv,
1035 USB_IDCHG_MIN - get_aca_bmaxpower(dev));
1036 break;
1037 default:
1038 break;
1039 }
1040
1041 if (suspend == atomic_read(&dev->in_lpm))
1042 return 0;
1043
1044 disable_irq(dev->irq);
1045 if (dev->pmic_vbus_notif_supp)
1046 if (can_phy_power_collapse(dev) &&
1047 dev->pdata->ldo_enable)
1048 dev->pdata->ldo_enable(1);
1049
1050 msm_otg_get_resume(dev);
1051
1052 if (!is_phy_clk_disabled())
1053 goto out;
1054
1055 timeout = jiffies + usecs_to_jiffies(100);
1056 enable_phy_clk();
1057 while (is_phy_clk_disabled() || !is_phy_active()) {
1058 if (time_after(jiffies, timeout)) {
1059 pr_err("%s: Unable to wakeup phy. "
1060 "is_phy_active: %x\n",
1061 __func__, !!is_phy_active());
1062 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001063 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001064 break;
1065 }
1066 udelay(10);
1067 }
Anji jonnalaae745e92011-11-14 18:34:31 +05301068 if (dev->pmic_id_notif_supp) {
1069 dev->pdata->pmic_id_notif_init(
1070 &msm_otg_set_id_state, 0);
1071 dev->pmic_id_notif_supp = 0;
1072 enable_idgnd(dev);
1073 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001074out:
1075 enable_idabc(dev);
1076 enable_irq(dev->irq);
1077
1078 }
1079
1080 return 0;
1081}
1082
Steve Mucklef132c6c2012-06-06 18:30:57 -07001083static int msm_otg_set_peripheral(struct usb_otg *otg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001084 struct usb_gadget *gadget)
1085{
Steve Mucklef132c6c2012-06-06 18:30:57 -07001086 struct msm_otg *dev = container_of(otg->phy, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001087
1088 if (!dev || (dev != the_msm_otg))
1089 return -ENODEV;
1090
1091 if (!gadget) {
Steve Mucklef132c6c2012-06-06 18:30:57 -07001092 msm_otg_start_peripheral(otg, 0);
1093 otg->gadget = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001094 disable_sess_valid(dev);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001095 if (!otg->host)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001096 disable_idabc(dev);
1097 return 0;
1098 }
Steve Mucklef132c6c2012-06-06 18:30:57 -07001099 otg->gadget = gadget;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001100 pr_info("peripheral driver registered w/ tranceiver\n");
1101
1102 wake_lock(&dev->wlock);
1103 queue_work(dev->wq, &dev->sm_work);
1104 return 0;
1105}
1106
1107#ifdef CONFIG_USB_EHCI_MSM_72K
1108static int usbdev_notify(struct notifier_block *self,
1109 unsigned long action, void *device)
1110{
1111 enum usb_otg_state state;
1112 struct msm_otg *dev = container_of(self, struct msm_otg, usbdev_nb);
1113 struct usb_device *udev = device;
1114 int work = 1;
1115 unsigned long flags;
1116
1117 /* Interested in only devices directly connected
1118 * to root hub directly.
1119 */
1120 if (!udev->parent || udev->parent->parent)
1121 goto out;
1122
1123 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001124 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001125 spin_unlock_irqrestore(&dev->lock, flags);
1126
1127 switch (state) {
1128 case OTG_STATE_A_WAIT_BCON:
1129 if (action == USB_DEVICE_ADD) {
1130 pr_debug("B_CONN set\n");
1131 set_bit(B_CONN, &dev->inputs);
1132 if (udev->actconfig) {
1133 set_aca_bmaxpower(dev,
1134 udev->actconfig->desc.bMaxPower * 2);
1135 goto do_work;
1136 }
1137 if (udev->portnum == udev->bus->otg_port)
1138 set_aca_bmaxpower(dev, USB_IB_UNCFG);
1139 else
1140 set_aca_bmaxpower(dev, 100);
1141 }
1142 break;
1143 case OTG_STATE_A_HOST:
1144 if (action == USB_DEVICE_REMOVE) {
1145 pr_debug("B_CONN clear\n");
1146 clear_bit(B_CONN, &dev->inputs);
1147 set_aca_bmaxpower(dev, 0);
1148 }
1149 break;
1150 default:
1151 work = 0;
1152 break;
1153 }
1154do_work:
1155 if (work) {
1156 wake_lock(&dev->wlock);
1157 queue_work(dev->wq, &dev->sm_work);
1158 }
1159out:
1160 return NOTIFY_OK;
1161}
1162
Steve Mucklef132c6c2012-06-06 18:30:57 -07001163static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001164{
Steve Mucklef132c6c2012-06-06 18:30:57 -07001165 struct msm_otg *dev = container_of(otg->phy, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001166
1167 if (!dev || (dev != the_msm_otg))
1168 return -ENODEV;
1169
1170 if (!dev->start_host)
1171 return -ENODEV;
1172
1173 if (!host) {
Steve Mucklef132c6c2012-06-06 18:30:57 -07001174 msm_otg_start_host(otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001175 usb_unregister_notify(&dev->usbdev_nb);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001176 otg->host = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001177 dev->start_host = 0;
1178 disable_idgnd(dev);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001179 if (!otg->gadget)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001180 disable_idabc(dev);
1181 return 0;
1182 }
1183#ifdef CONFIG_USB_OTG
1184 host->otg_port = 1;
1185#endif
1186 dev->usbdev_nb.notifier_call = usbdev_notify;
1187 usb_register_notify(&dev->usbdev_nb);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001188 otg->host = host;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001189 pr_info("host driver registered w/ tranceiver\n");
1190
1191#ifndef CONFIG_USB_MSM_72K
1192 wake_lock(&dev->wlock);
1193 queue_work(dev->wq, &dev->sm_work);
1194#endif
1195 return 0;
1196}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001197
Anji jonnalaae745e92011-11-14 18:34:31 +05301198static void msm_otg_set_id_state(int id)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001199{
1200 struct msm_otg *dev = the_msm_otg;
1201 unsigned long flags;
1202
Anji jonnalaae745e92011-11-14 18:34:31 +05301203 if (!atomic_read(&dev->in_lpm))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001204 return;
1205
1206 if (id) {
1207 set_bit(ID, &dev->inputs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001208 } else {
1209 clear_bit(ID, &dev->inputs);
1210 set_bit(A_BUS_REQ, &dev->inputs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001211 }
1212 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001213 if (dev->phy.state != OTG_STATE_UNDEFINED) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001214 wake_lock(&dev->wlock);
1215 queue_work(dev->wq, &dev->sm_work);
1216 }
1217 spin_unlock_irqrestore(&dev->lock, flags);
1218}
Anji jonnalaae745e92011-11-14 18:34:31 +05301219#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001220
1221void msm_otg_set_vbus_state(int online)
1222{
1223 struct msm_otg *dev = the_msm_otg;
1224
Rajkumar Raghupathyf5c6c602011-11-25 16:20:42 +05301225 /*
1226 * Process disconnect only for wallcharger
1227 * during fast plug-out plug-in at the
1228 * AC source side.
1229 */
1230 if (online)
1231 set_bit(B_SESS_VLD, &dev->inputs);
1232 else
1233 clear_bit(B_SESS_VLD, &dev->inputs);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001234
1235 wake_lock(&dev->wlock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001236 queue_work(dev->wq, &dev->sm_work);
1237}
1238
1239static irqreturn_t msm_otg_irq(int irq, void *data)
1240{
1241 struct msm_otg *dev = data;
1242 u32 otgsc, sts, pc, sts_mask;
1243 irqreturn_t ret = IRQ_HANDLED;
1244 int work = 0;
1245 enum usb_otg_state state;
1246 unsigned long flags;
1247
1248 if (atomic_read(&dev->in_lpm)) {
1249 disable_irq_nosync(dev->irq);
1250 wake_lock(&dev->wlock);
1251 queue_work(dev->wq, &dev->otg_resume_work);
1252 goto out;
1253 }
1254
1255 /* Return immediately if instead of ID pin, USER controls mode switch */
1256 if (dev->pdata->otg_mode == OTG_USER_CONTROL)
1257 return IRQ_NONE;
1258
1259
1260 otgsc = readl(USB_OTGSC);
1261 sts = readl(USB_USBSTS);
1262
1263 sts_mask = (otgsc & OTGSC_INTR_MASK) >> 8;
1264
1265 if (!((otgsc & sts_mask) || (sts & STS_PCI))) {
1266 ret = IRQ_NONE;
1267 goto out;
1268 }
1269
1270 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001271 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001272 spin_unlock_irqrestore(&dev->lock, flags);
1273
1274 pr_debug("IRQ state: %s\n", state_string(state));
1275 pr_debug("otgsc = %x\n", otgsc);
1276
1277 if ((otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) {
1278 if (otgsc & OTGSC_ID) {
1279 pr_debug("Id set\n");
1280 set_bit(ID, &dev->inputs);
1281 } else {
1282 pr_debug("Id clear\n");
1283 /* Assert a_bus_req to supply power on
1284 * VBUS when Micro/Mini-A cable is connected
1285 * with out user intervention.
1286 */
1287 set_bit(A_BUS_REQ, &dev->inputs);
1288 clear_bit(ID, &dev->inputs);
1289 }
1290 writel(otgsc, USB_OTGSC);
1291 work = 1;
1292 } else if (otgsc & OTGSC_BSVIS) {
1293 writel(otgsc, USB_OTGSC);
1294 /* BSV interrupt comes when operating as an A-device
1295 * (VBUS on/off).
1296 * But, handle BSV when charger is removed from ACA in ID_A
1297 */
1298 if ((state >= OTG_STATE_A_IDLE) &&
1299 !test_bit(ID_A, &dev->inputs))
1300 goto out;
1301 if (otgsc & OTGSC_BSV) {
1302 pr_debug("BSV set\n");
1303 set_bit(B_SESS_VLD, &dev->inputs);
1304 } else {
1305 pr_debug("BSV clear\n");
1306 clear_bit(B_SESS_VLD, &dev->inputs);
1307 }
1308 work = 1;
1309 } else if (otgsc & OTGSC_DPIS) {
1310 pr_debug("DPIS detected\n");
1311 writel(otgsc, USB_OTGSC);
1312 set_bit(A_SRP_DET, &dev->inputs);
1313 set_bit(A_BUS_REQ, &dev->inputs);
1314 work = 1;
1315 } else if (sts & STS_PCI) {
1316 pc = readl(USB_PORTSC);
1317 pr_debug("portsc = %x\n", pc);
1318 ret = IRQ_NONE;
1319 /* HCD Acks PCI interrupt. We use this to switch
1320 * between different OTG states.
1321 */
1322 work = 1;
1323 switch (state) {
1324 case OTG_STATE_A_SUSPEND:
Steve Mucklef132c6c2012-06-06 18:30:57 -07001325 if (dev->phy.otg->host->b_hnp_enable &&
1326 (pc & PORTSC_CSC) &&
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001327 !(pc & PORTSC_CCS)) {
1328 pr_debug("B_CONN clear\n");
1329 clear_bit(B_CONN, &dev->inputs);
1330 }
1331 break;
1332 case OTG_STATE_B_WAIT_ACON:
1333 if ((pc & PORTSC_CSC) && (pc & PORTSC_CCS)) {
1334 pr_debug("A_CONN set\n");
1335 set_bit(A_CONN, &dev->inputs);
1336 /* Clear ASE0_BRST timer */
1337 msm_otg_del_timer(dev);
1338 }
1339 break;
1340 case OTG_STATE_B_HOST:
1341 if ((pc & PORTSC_CSC) && !(pc & PORTSC_CCS)) {
1342 pr_debug("A_CONN clear\n");
1343 clear_bit(A_CONN, &dev->inputs);
1344 }
1345 break;
1346 default:
1347 work = 0;
1348 break;
1349 }
1350 }
1351 if (work) {
1352#ifdef CONFIG_USB_MSM_ACA
1353 /* With ACA, ID can change bcoz of BSVIS as well, so update */
1354 if ((otgsc & OTGSC_IDIS) || (otgsc & OTGSC_BSVIS))
1355 set_aca_id_inputs(dev);
1356#endif
1357 wake_lock(&dev->wlock);
1358 queue_work(dev->wq, &dev->sm_work);
1359 }
1360out:
1361 return ret;
1362}
1363
1364#define ULPI_VERIFY_MAX_LOOP_COUNT 5
1365#define PHY_CALIB_RETRY_COUNT 10
1366static void phy_clk_reset(struct msm_otg *dev)
1367{
1368 unsigned rc;
1369 enum clk_reset_action assert = CLK_RESET_ASSERT;
1370
1371 if (dev->pdata->phy_reset_sig_inverted)
1372 assert = CLK_RESET_DEASSERT;
1373
1374 rc = clk_reset(dev->phy_reset_clk, assert);
1375 if (rc) {
1376 pr_err("%s: phy clk assert failed\n", __func__);
1377 return;
1378 }
1379
1380 msleep(1);
1381
1382 rc = clk_reset(dev->phy_reset_clk, !assert);
1383 if (rc) {
1384 pr_err("%s: phy clk deassert failed\n", __func__);
1385 return;
1386 }
1387
1388 msleep(1);
1389}
1390
1391static unsigned ulpi_read_with_reset(struct msm_otg *dev, unsigned reg)
1392{
1393 int temp;
1394 unsigned res;
1395
1396 for (temp = 0; temp < ULPI_VERIFY_MAX_LOOP_COUNT; temp++) {
1397 res = ulpi_read(dev, reg);
1398 if (res != 0xffffffff)
1399 return res;
1400
1401 phy_clk_reset(dev);
1402 }
1403
1404 pr_err("%s: ulpi read failed for %d times\n",
1405 __func__, ULPI_VERIFY_MAX_LOOP_COUNT);
1406
1407 return -1;
1408}
1409
1410static int ulpi_write_with_reset(struct msm_otg *dev,
1411unsigned val, unsigned reg)
1412{
1413 int temp, res;
1414
1415 for (temp = 0; temp < ULPI_VERIFY_MAX_LOOP_COUNT; temp++) {
1416 res = ulpi_write(dev, val, reg);
1417 if (!res)
1418 return 0;
1419 phy_clk_reset(dev);
1420 }
1421 pr_err("%s: ulpi write failed for %d times\n",
1422 __func__, ULPI_VERIFY_MAX_LOOP_COUNT);
1423
1424 return -1;
1425}
1426
James Sullins0ada9672013-12-25 17:12:35 -06001427#ifdef CONFIG_USB_MULTIPLE_CHARGER_DETECT
1428static int usb_ulpi_write_with_reset(struct usb_phy *xceiv, u32 val, u32 reg)
1429{
1430 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
1431
1432 return ulpi_write_with_reset(dev, val, reg);
1433}
1434
1435static int usb_ulpi_read_with_reset(struct usb_phy *xceiv, u32 reg)
1436{
1437 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
1438
1439 return ulpi_read_with_reset(dev, reg);
1440}
1441#endif
1442
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001443/* some of the older targets does not turn off the PLL
1444 * if onclock bit is set and clocksuspendM bit is on,
1445 * hence clear them too and initiate the suspend mode
1446 * by clearing SupendM bit.
1447 */
1448static inline int turn_off_phy_pll(struct msm_otg *dev)
1449{
1450 unsigned res;
1451
1452 res = ulpi_read_with_reset(dev, ULPI_CONFIG_REG1);
1453 if (res == 0xffffffff)
1454 return -ETIMEDOUT;
1455
1456 res = ulpi_write_with_reset(dev,
1457 res & ~(ULPI_ONCLOCK), ULPI_CONFIG_REG1);
1458 if (res)
1459 return -ETIMEDOUT;
1460
1461 res = ulpi_write_with_reset(dev,
1462 ULPI_CLOCK_SUSPENDM, ULPI_IFC_CTRL_CLR);
1463 if (res)
1464 return -ETIMEDOUT;
1465
1466 /*Clear SuspendM bit to initiate suspend mode */
1467 res = ulpi_write_with_reset(dev,
1468 ULPI_SUSPENDM, ULPI_FUNC_CTRL_CLR);
1469 if (res)
1470 return -ETIMEDOUT;
1471
1472 return res;
1473}
1474
1475static inline int check_phy_caliberation(struct msm_otg *dev)
1476{
1477 unsigned res;
1478
1479 res = ulpi_read_with_reset(dev, ULPI_DEBUG);
1480
1481 if (res == 0xffffffff)
1482 return -ETIMEDOUT;
1483
1484 if (!(res & ULPI_CALIB_STS) && ULPI_CALIB_VAL(res))
1485 return 0;
1486
1487 return -1;
1488}
1489
1490static int msm_otg_phy_caliberate(struct msm_otg *dev)
1491{
1492 int i = 0;
1493 unsigned long res;
1494
1495 do {
1496 res = turn_off_phy_pll(dev);
1497 if (res)
1498 return -ETIMEDOUT;
1499
1500 /* bring phy out of suspend */
1501 phy_clk_reset(dev);
1502
1503 res = check_phy_caliberation(dev);
1504 if (!res)
1505 return res;
1506 i++;
1507
1508 } while (i < PHY_CALIB_RETRY_COUNT);
1509
1510 return res;
1511}
1512
1513static int msm_otg_phy_reset(struct msm_otg *dev)
1514{
1515 unsigned rc;
1516 unsigned temp;
1517 unsigned long timeout;
1518
Manu Gautam5143b252012-01-05 19:25:23 -08001519 rc = clk_reset(dev->alt_core_clk, CLK_RESET_ASSERT);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001520 if (rc) {
1521 pr_err("%s: usb hs clk assert failed\n", __func__);
1522 return -1;
1523 }
1524
1525 phy_clk_reset(dev);
1526
Manu Gautam5143b252012-01-05 19:25:23 -08001527 rc = clk_reset(dev->alt_core_clk, CLK_RESET_DEASSERT);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001528 if (rc) {
1529 pr_err("%s: usb hs clk deassert failed\n", __func__);
1530 return -1;
1531 }
1532 /* Observing ulpi timeouts as part of PHY calibration. On resetting
1533 * the HW link explicity by setting the RESET bit in the USBCMD
1534 * register before PHY calibration fixes the ulpi timeout issue.
1535 * This workaround is required for unicorn target
1536 */
1537 writel_relaxed(USBCMD_RESET, USB_USBCMD);
1538 timeout = jiffies + USB_LINK_RESET_TIMEOUT;
1539 do {
1540 if (time_after(jiffies, timeout)) {
1541 pr_err("msm_otg: usb link reset timeout\n");
1542 break;
1543 }
1544 usleep_range(1000, 1200);
1545 } while (readl_relaxed(USB_USBCMD) & USBCMD_RESET);
1546
1547 /* select ULPI phy */
1548 temp = (readl(USB_PORTSC) & ~PORTSC_PTS);
1549 writel(temp | PORTSC_PTS_ULPI, USB_PORTSC);
1550
1551 if (atomic_read(&dev->chg_type) !=
1552 USB_CHG_TYPE__WALLCHARGER) {
1553 rc = msm_otg_phy_caliberate(dev);
1554 if (rc)
1555 return rc;
1556 }
1557
1558 /* TBD: There are two link resets. One is below and other one
1559 * is done immediately after this function. See if we can
1560 * eliminate one of these.
1561 */
1562 writel(USBCMD_RESET, USB_USBCMD);
1563 timeout = jiffies + USB_LINK_RESET_TIMEOUT;
1564 do {
1565 if (time_after(jiffies, timeout)) {
1566 pr_err("msm_otg: usb link reset timeout\n");
1567 break;
1568 }
1569 msleep(1);
1570 } while (readl(USB_USBCMD) & USBCMD_RESET);
1571
1572 if (readl(USB_USBCMD) & USBCMD_RESET) {
1573 pr_err("%s: usb core reset failed\n", __func__);
1574 return -1;
1575 }
1576
1577 return 0;
1578}
1579
Steve Mucklef132c6c2012-06-06 18:30:57 -07001580static void otg_reset(struct usb_phy *xceiv, int phy_reset)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001581{
Steve Mucklef132c6c2012-06-06 18:30:57 -07001582 struct msm_otg *dev = container_of(xceiv, struct msm_otg, phy);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001583 unsigned long timeout;
1584 u32 mode, work = 0;
1585
Manu Gautam28b1bac2012-01-30 16:43:06 +05301586 clk_prepare_enable(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001587
1588 if (!phy_reset)
1589 goto reset_link;
1590
1591 if (dev->pdata->phy_reset)
1592 dev->pdata->phy_reset(dev->regs);
1593 else
1594 msm_otg_phy_reset(dev);
1595
1596 /*disable all phy interrupts*/
1597 ulpi_write(dev, 0xFF, 0x0F);
1598 ulpi_write(dev, 0xFF, 0x12);
1599 msleep(100);
1600
1601reset_link:
1602 writel(USBCMD_RESET, USB_USBCMD);
1603 timeout = jiffies + USB_LINK_RESET_TIMEOUT;
1604 do {
1605 if (time_after(jiffies, timeout)) {
1606 pr_err("msm_otg: usb link reset timeout\n");
1607 break;
1608 }
1609 msleep(1);
1610 } while (readl(USB_USBCMD) & USBCMD_RESET);
1611
1612 /* select ULPI phy */
1613 writel(0x80000000, USB_PORTSC);
1614
1615 set_pre_emphasis_level(dev);
1616 set_hsdrv_slope(dev);
1617 set_cdr_auto_reset(dev);
1618 set_driver_amplitude(dev);
1619 set_se1_gating(dev);
1620
1621 writel(0x0, USB_AHB_BURST);
1622 writel(0x00, USB_AHB_MODE);
Chandra Devireddyb3fc78c2011-08-30 17:25:55 +05301623 if (dev->pdata->bam_disable) {
1624 writel_relaxed((readl_relaxed(USB_GEN_CONFIG) |
1625 USB_BAM_DISABLE), USB_GEN_CONFIG);
1626 pr_debug("%s(): USB_GEN_CONFIG = %x\n",
1627 __func__, readl_relaxed(USB_GEN_CONFIG));
1628 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001629 /* Ensure that RESET operation is completed before turning off clock */
1630 mb();
1631
Manu Gautam28b1bac2012-01-30 16:43:06 +05301632 clk_disable_unprepare(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001633
Steve Mucklef132c6c2012-06-06 18:30:57 -07001634 if ((xceiv->otg->gadget && xceiv->otg->gadget->is_a_peripheral) ||
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001635 test_bit(ID, &dev->inputs))
1636 mode = USBMODE_SDIS | USBMODE_DEVICE;
1637 else
1638 mode = USBMODE_SDIS | USBMODE_HOST;
1639 writel(mode, USB_USBMODE);
1640
1641 writel_relaxed((readl_relaxed(USB_OTGSC) | OTGSC_IDPU), USB_OTGSC);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001642 if (dev->phy.otg->gadget) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001643 enable_sess_valid(dev);
1644 /* Due to the above 100ms delay, interrupts from PHY are
1645 * sometimes missed during fast plug-in/plug-out of cable.
1646 * Check for such cases here.
1647 */
1648 if (is_b_sess_vld() && !test_bit(B_SESS_VLD, &dev->inputs)) {
1649 pr_debug("%s: handle missing BSV event\n", __func__);
1650 set_bit(B_SESS_VLD, &dev->inputs);
1651 work = 1;
1652 } else if (!is_b_sess_vld() && test_bit(B_SESS_VLD,
1653 &dev->inputs)) {
1654 pr_debug("%s: handle missing !BSV event\n", __func__);
1655 clear_bit(B_SESS_VLD, &dev->inputs);
1656 work = 1;
1657 }
1658 }
1659
1660#ifdef CONFIG_USB_EHCI_MSM_72K
Steve Mucklef132c6c2012-06-06 18:30:57 -07001661 if (dev->phy.otg->host && !dev->pmic_id_notif_supp) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001662 enable_idgnd(dev);
1663 /* Handle missing ID_GND interrupts during fast PIPO */
1664 if (is_host() && test_bit(ID, &dev->inputs)) {
1665 pr_debug("%s: handle missing ID_GND event\n", __func__);
1666 clear_bit(ID, &dev->inputs);
1667 work = 1;
1668 } else if (!is_host() && !test_bit(ID, &dev->inputs)) {
1669 pr_debug("%s: handle missing !ID_GND event\n",
1670 __func__);
1671 set_bit(ID, &dev->inputs);
1672 work = 1;
1673 }
1674 } else {
1675 disable_idgnd(dev);
1676 }
1677#endif
1678
1679 enable_idabc(dev);
1680
1681 if (work) {
1682 wake_lock(&dev->wlock);
1683 queue_work(dev->wq, &dev->sm_work);
1684 }
1685}
1686
1687static void msm_otg_sm_work(struct work_struct *w)
1688{
1689 struct msm_otg *dev = container_of(w, struct msm_otg, sm_work);
1690 enum chg_type chg_type = atomic_read(&dev->chg_type);
1691 int ret;
1692 int work = 0;
1693 enum usb_otg_state state;
1694 unsigned long flags;
1695
1696 if (atomic_read(&dev->in_lpm))
Steve Mucklef132c6c2012-06-06 18:30:57 -07001697 msm_otg_set_suspend(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001698
1699 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001700 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001701 spin_unlock_irqrestore(&dev->lock, flags);
1702
1703 switch (state) {
1704 case OTG_STATE_UNDEFINED:
1705
1706 /*
1707 * We can come here when LPM fails with wall charger
Pavankumar Kondetidc60f122011-09-13 11:17:16 +05301708 * connected. Change the state to B_PERIPHERAL and
1709 * schedule the work which takes care of resetting the
1710 * PHY and putting the hardware in low power mode.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001711 */
1712 if (atomic_read(&dev->chg_type) ==
1713 USB_CHG_TYPE__WALLCHARGER) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001714 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001715 dev->phy.state = OTG_STATE_B_PERIPHERAL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001716 spin_unlock_irqrestore(&dev->lock, flags);
1717 work = 1;
1718 break;
1719 }
1720
1721 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001722 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001723
1724#ifdef CONFIG_USB_MSM_ACA
1725 set_aca_id_inputs(dev);
1726#endif
1727 if (dev->pdata->otg_mode == OTG_USER_CONTROL) {
1728 if ((dev->pdata->usb_mode == USB_PERIPHERAL_MODE) ||
Steve Mucklef132c6c2012-06-06 18:30:57 -07001729 !dev->phy.otg->host) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001730 set_bit(ID, &dev->inputs);
1731 set_bit(B_SESS_VLD, &dev->inputs);
1732 }
1733 } else {
Steve Mucklef132c6c2012-06-06 18:30:57 -07001734 if (!dev->phy.otg->host || !is_host())
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001735 set_bit(ID, &dev->inputs);
1736
Steve Mucklef132c6c2012-06-06 18:30:57 -07001737 if (dev->phy.otg->gadget && is_b_sess_vld())
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001738 set_bit(B_SESS_VLD, &dev->inputs);
1739 }
1740 spin_lock_irqsave(&dev->lock, flags);
1741 if ((test_bit(ID, &dev->inputs)) &&
1742 !test_bit(ID_A, &dev->inputs)) {
Steve Mucklef132c6c2012-06-06 18:30:57 -07001743 dev->phy.state = OTG_STATE_B_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001744 } else {
1745 set_bit(A_BUS_REQ, &dev->inputs);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001746 dev->phy.state = OTG_STATE_A_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001747 }
1748 spin_unlock_irqrestore(&dev->lock, flags);
1749
1750 work = 1;
1751 break;
1752 case OTG_STATE_B_IDLE:
Steve Mucklef132c6c2012-06-06 18:30:57 -07001753 dev->phy.otg->default_a = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001754 if (!test_bit(ID, &dev->inputs) ||
1755 test_bit(ID_A, &dev->inputs)) {
1756 pr_debug("!id || id_A\n");
1757 clear_bit(B_BUS_REQ, &dev->inputs);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001758 otg_reset(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001759
1760 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001761 dev->phy.state = OTG_STATE_A_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001762 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001763 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001764 work = 1;
1765 } else if (test_bit(B_SESS_VLD, &dev->inputs) &&
1766 !test_bit(ID_B, &dev->inputs)) {
1767 pr_debug("b_sess_vld\n");
1768 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001769 dev->phy.state = OTG_STATE_B_PERIPHERAL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001770 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001771 msm_otg_set_power(&dev->phy, 0);
1772 msm_otg_start_peripheral(dev->phy.otg, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001773 } else if (test_bit(B_BUS_REQ, &dev->inputs)) {
1774 pr_debug("b_sess_end && b_bus_req\n");
Steve Mucklef132c6c2012-06-06 18:30:57 -07001775 ret = msm_otg_start_srp(dev->phy.otg);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001776 if (ret < 0) {
1777 /* notify user space */
1778 clear_bit(B_BUS_REQ, &dev->inputs);
1779 work = 1;
1780 break;
1781 }
1782 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001783 dev->phy.state = OTG_STATE_B_SRP_INIT;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001784 spin_unlock_irqrestore(&dev->lock, flags);
1785 msm_otg_start_timer(dev, TB_SRP_FAIL, B_SRP_FAIL);
1786 break;
1787 } else if (test_bit(ID_B, &dev->inputs)) {
1788 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001789 msm_otg_set_power(&dev->phy, USB_IDCHG_MAX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001790 } else {
Steve Mucklef132c6c2012-06-06 18:30:57 -07001791 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001792 pr_debug("entering into lpm\n");
1793 msm_otg_put_suspend(dev);
1794
1795 if (dev->pdata->ldo_set_voltage)
1796 dev->pdata->ldo_set_voltage(3075);
1797 }
1798 break;
1799 case OTG_STATE_B_SRP_INIT:
1800 if (!test_bit(ID, &dev->inputs) ||
1801 test_bit(ID_A, &dev->inputs) ||
1802 test_bit(ID_C, &dev->inputs) ||
1803 (test_bit(B_SESS_VLD, &dev->inputs) &&
1804 !test_bit(ID_B, &dev->inputs))) {
1805 pr_debug("!id || id_a/c || b_sess_vld+!id_b\n");
1806 msm_otg_del_timer(dev);
1807 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001808 dev->phy.state = OTG_STATE_B_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001809 spin_unlock_irqrestore(&dev->lock, flags);
1810 work = 1;
1811 } else if (test_bit(B_SRP_FAIL, &dev->tmouts)) {
1812 pr_debug("b_srp_fail\n");
1813 /* notify user space */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001814 msm_otg_send_event(dev->phy.otg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001815 OTG_EVENT_NO_RESP_FOR_SRP);
1816 clear_bit(B_BUS_REQ, &dev->inputs);
1817 clear_bit(B_SRP_FAIL, &dev->tmouts);
1818 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001819 dev->phy.state = OTG_STATE_B_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001820 spin_unlock_irqrestore(&dev->lock, flags);
1821 dev->b_last_se0_sess = jiffies;
1822 work = 1;
1823 }
1824 break;
1825 case OTG_STATE_B_PERIPHERAL:
1826 if (!test_bit(ID, &dev->inputs) ||
1827 test_bit(ID_A, &dev->inputs) ||
1828 test_bit(ID_B, &dev->inputs) ||
1829 !test_bit(B_SESS_VLD, &dev->inputs)) {
1830 pr_debug("!id || id_a/b || !b_sess_vld\n");
1831 clear_bit(B_BUS_REQ, &dev->inputs);
1832 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001833 dev->phy.state = OTG_STATE_B_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001834 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001835 msm_otg_start_peripheral(dev->phy.otg, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001836 dev->b_last_se0_sess = jiffies;
1837
1838 /* Workaround: Reset phy after session */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001839 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001840 work = 1;
1841 } else if (test_bit(B_BUS_REQ, &dev->inputs) &&
Steve Mucklef132c6c2012-06-06 18:30:57 -07001842 dev->phy.otg->gadget->b_hnp_enable &&
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001843 test_bit(A_BUS_SUSPEND, &dev->inputs)) {
1844 pr_debug("b_bus_req && b_hnp_en && a_bus_suspend\n");
1845 msm_otg_start_timer(dev, TB_ASE0_BRST, B_ASE0_BRST);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001846 msm_otg_start_peripheral(dev->phy.otg, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001847 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001848 dev->phy.state = OTG_STATE_B_WAIT_ACON;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001849 spin_unlock_irqrestore(&dev->lock, flags);
1850 /* start HCD even before A-device enable
1851 * pull-up to meet HNP timings.
1852 */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001853 dev->phy.otg->host->is_b_host = 1;
1854 msm_otg_start_host(dev->phy.otg, REQUEST_START);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001855
1856 } else if (test_bit(ID_C, &dev->inputs)) {
1857 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001858 msm_otg_set_power(&dev->phy, USB_IDCHG_MAX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001859 } else if (chg_type == USB_CHG_TYPE__WALLCHARGER) {
1860#ifdef CONFIG_USB_MSM_ACA
1861 del_timer_sync(&dev->id_timer);
1862#endif
1863 /* Workaround: Reset PHY in SE1 state */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001864 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001865 pr_debug("entering into lpm with wall-charger\n");
1866 msm_otg_put_suspend(dev);
1867 /* Allow idle power collapse */
1868 otg_pm_qos_update_latency(dev, 0);
1869 }
1870 break;
1871 case OTG_STATE_B_WAIT_ACON:
1872 if (!test_bit(ID, &dev->inputs) ||
1873 test_bit(ID_A, &dev->inputs) ||
1874 test_bit(ID_B, &dev->inputs) ||
1875 !test_bit(B_SESS_VLD, &dev->inputs)) {
1876 pr_debug("!id || id_a/b || !b_sess_vld\n");
1877 msm_otg_del_timer(dev);
1878 /* A-device is physically disconnected during
1879 * HNP. Remove HCD.
1880 */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001881 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
1882 dev->phy.otg->host->is_b_host = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001883
1884 clear_bit(B_BUS_REQ, &dev->inputs);
1885 clear_bit(A_BUS_SUSPEND, &dev->inputs);
1886 dev->b_last_se0_sess = jiffies;
1887 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001888 dev->phy.state = OTG_STATE_B_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001889 spin_unlock_irqrestore(&dev->lock, flags);
1890
1891 /* Workaround: Reset phy after session */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001892 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001893 work = 1;
1894 } else if (test_bit(A_CONN, &dev->inputs)) {
1895 pr_debug("a_conn\n");
1896 clear_bit(A_BUS_SUSPEND, &dev->inputs);
1897 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001898 dev->phy.state = OTG_STATE_B_HOST;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001899 spin_unlock_irqrestore(&dev->lock, flags);
1900 if (test_bit(ID_C, &dev->inputs)) {
1901 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001902 msm_otg_set_power(&dev->phy, USB_IDCHG_MAX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001903 }
1904 } else if (test_bit(B_ASE0_BRST, &dev->tmouts)) {
1905 /* TODO: A-device may send reset after
1906 * enabling HNP; a_bus_resume case is
1907 * not handled for now.
1908 */
1909 pr_debug("b_ase0_brst_tmout\n");
Steve Mucklef132c6c2012-06-06 18:30:57 -07001910 msm_otg_send_event(dev->phy.otg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001911 OTG_EVENT_HNP_FAILED);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001912 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
1913 dev->phy.otg->host->is_b_host = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001914 clear_bit(B_ASE0_BRST, &dev->tmouts);
1915 clear_bit(A_BUS_SUSPEND, &dev->inputs);
1916 clear_bit(B_BUS_REQ, &dev->inputs);
1917
1918 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001919 dev->phy.state = OTG_STATE_B_PERIPHERAL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001920 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001921 msm_otg_start_peripheral(dev->phy.otg, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001922 } else if (test_bit(ID_C, &dev->inputs)) {
1923 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001924 msm_otg_set_power(&dev->phy, USB_IDCHG_MAX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001925 }
1926 break;
1927 case OTG_STATE_B_HOST:
1928 /* B_BUS_REQ is not exposed to user space. So
1929 * it must be A_CONN for now.
1930 */
1931 if (!test_bit(B_BUS_REQ, &dev->inputs) ||
1932 !test_bit(A_CONN, &dev->inputs)) {
1933 pr_debug("!b_bus_req || !a_conn\n");
1934 clear_bit(A_CONN, &dev->inputs);
1935 clear_bit(B_BUS_REQ, &dev->inputs);
1936
Steve Mucklef132c6c2012-06-06 18:30:57 -07001937 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
1938 dev->phy.otg->host->is_b_host = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001939
1940 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001941 dev->phy.state = OTG_STATE_B_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001942 spin_unlock_irqrestore(&dev->lock, flags);
1943 /* Workaround: Reset phy after session */
Steve Mucklef132c6c2012-06-06 18:30:57 -07001944 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001945 work = 1;
1946 } else if (test_bit(ID_C, &dev->inputs)) {
1947 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001948 msm_otg_set_power(&dev->phy, USB_IDCHG_MAX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001949 }
1950 break;
1951 case OTG_STATE_A_IDLE:
Steve Mucklef132c6c2012-06-06 18:30:57 -07001952 dev->phy.otg->default_a = 1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001953 if (test_bit(ID, &dev->inputs) &&
1954 !test_bit(ID_A, &dev->inputs)) {
1955 pr_debug("id && !id_a\n");
Steve Mucklef132c6c2012-06-06 18:30:57 -07001956 dev->phy.otg->default_a = 0;
1957 otg_reset(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001958 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001959 dev->phy.state = OTG_STATE_B_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001960 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001961 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001962 work = 1;
1963 } else if (!test_bit(A_BUS_DROP, &dev->inputs) &&
1964 (test_bit(A_SRP_DET, &dev->inputs) ||
1965 test_bit(A_BUS_REQ, &dev->inputs))) {
1966 pr_debug("!a_bus_drop && (a_srp_det || a_bus_req)\n");
1967
1968 clear_bit(A_SRP_DET, &dev->inputs);
1969 /* Disable SRP detection */
1970 writel((readl(USB_OTGSC) & ~OTGSC_INTR_STS_MASK) &
1971 ~OTGSC_DPIE, USB_OTGSC);
1972
1973 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07001974 dev->phy.state = OTG_STATE_A_WAIT_VRISE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001975 spin_unlock_irqrestore(&dev->lock, flags);
1976 /* ACA: ID_A: Stop charging untill enumeration */
1977 if (test_bit(ID_A, &dev->inputs))
Steve Mucklef132c6c2012-06-06 18:30:57 -07001978 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001979 else
1980 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
1981 msm_otg_start_timer(dev, TA_WAIT_VRISE, A_WAIT_VRISE);
1982 /* no need to schedule work now */
1983 } else {
1984 pr_debug("No session requested\n");
1985
1986 /* A-device is not providing power on VBUS.
1987 * Enable SRP detection.
1988 */
1989 writel((readl(USB_OTGSC) & ~OTGSC_INTR_STS_MASK) |
1990 OTGSC_DPIE, USB_OTGSC);
1991 msm_otg_put_suspend(dev);
1992
1993 }
1994 break;
1995 case OTG_STATE_A_WAIT_VRISE:
1996 if ((test_bit(ID, &dev->inputs) &&
1997 !test_bit(ID_A, &dev->inputs)) ||
1998 test_bit(A_BUS_DROP, &dev->inputs) ||
1999 test_bit(A_WAIT_VRISE, &dev->tmouts)) {
2000 pr_debug("id || a_bus_drop || a_wait_vrise_tmout\n");
2001 clear_bit(A_BUS_REQ, &dev->inputs);
2002 msm_otg_del_timer(dev);
2003 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2004 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002005 dev->phy.state = OTG_STATE_A_WAIT_VFALL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002006 spin_unlock_irqrestore(&dev->lock, flags);
2007 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
2008 } else if (test_bit(A_VBUS_VLD, &dev->inputs)) {
2009 pr_debug("a_vbus_vld\n");
2010 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002011 dev->phy.state = OTG_STATE_A_WAIT_BCON;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002012 spin_unlock_irqrestore(&dev->lock, flags);
2013 if (TA_WAIT_BCON > 0)
2014 msm_otg_start_timer(dev, TA_WAIT_BCON,
2015 A_WAIT_BCON);
2016 /* Start HCD to detect peripherals. */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002017 msm_otg_start_host(dev->phy.otg, REQUEST_START);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002018 }
2019 break;
2020 case OTG_STATE_A_WAIT_BCON:
2021 if ((test_bit(ID, &dev->inputs) &&
2022 !test_bit(ID_A, &dev->inputs)) ||
2023 test_bit(A_BUS_DROP, &dev->inputs) ||
2024 test_bit(A_WAIT_BCON, &dev->tmouts)) {
2025 pr_debug("id_f/b/c || a_bus_drop ||"
2026 "a_wait_bcon_tmout\n");
2027 if (test_bit(A_WAIT_BCON, &dev->tmouts))
Steve Mucklef132c6c2012-06-06 18:30:57 -07002028 msm_otg_send_event(dev->phy.otg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002029 OTG_EVENT_DEV_CONN_TMOUT);
2030 msm_otg_del_timer(dev);
2031 clear_bit(A_BUS_REQ, &dev->inputs);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002032 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002033 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002034 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002035 /* ACA: ID_A with NO accessory, just the A plug is
2036 * attached to ACA: Use IDCHG_MAX for charging
2037 */
2038 if (test_bit(ID_A, &dev->inputs))
Steve Mucklef132c6c2012-06-06 18:30:57 -07002039 msm_otg_set_power(&dev->phy, USB_IDCHG_MAX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002040 else
2041 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2042 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002043 dev->phy.state = OTG_STATE_A_WAIT_VFALL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002044 spin_unlock_irqrestore(&dev->lock, flags);
2045 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
2046 } else if (test_bit(B_CONN, &dev->inputs)) {
2047 pr_debug("b_conn\n");
2048 msm_otg_del_timer(dev);
2049 /* HCD is added already. just move to
2050 * A_HOST state.
2051 */
2052 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002053 dev->phy.state = OTG_STATE_A_HOST;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002054 spin_unlock_irqrestore(&dev->lock, flags);
2055 if (test_bit(ID_A, &dev->inputs)) {
2056 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002057 msm_otg_set_power(&dev->phy,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002058 USB_IDCHG_MIN - get_aca_bmaxpower(dev));
2059 }
2060 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2061 pr_debug("!a_vbus_vld\n");
2062 msm_otg_del_timer(dev);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002063 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002064 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002065 dev->phy.state = OTG_STATE_A_VBUS_ERR;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002066 spin_unlock_irqrestore(&dev->lock, flags);
2067 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002068 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002069 } else if (test_bit(ID_A, &dev->inputs)) {
2070 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2071 } else if (!test_bit(ID, &dev->inputs)) {
Steve Mucklef132c6c2012-06-06 18:30:57 -07002072 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002073 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2074 }
2075 break;
2076 case OTG_STATE_A_HOST:
2077 if ((test_bit(ID, &dev->inputs) &&
2078 !test_bit(ID_A, &dev->inputs)) ||
2079 test_bit(A_BUS_DROP, &dev->inputs)) {
2080 pr_debug("id_f/b/c || a_bus_drop\n");
2081 clear_bit(B_CONN, &dev->inputs);
2082 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002083 dev->phy.state = OTG_STATE_A_WAIT_VFALL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002084 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002085 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002086 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002087 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002088 if (!test_bit(ID_A, &dev->inputs))
2089 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2090 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002091 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002092 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2093 pr_debug("!a_vbus_vld\n");
2094 clear_bit(B_CONN, &dev->inputs);
2095 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002096 dev->phy.state = OTG_STATE_A_VBUS_ERR;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002097 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002098 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002099 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002100 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002101 /* no work */
2102 } else if (!test_bit(A_BUS_REQ, &dev->inputs)) {
2103 /* a_bus_req is de-asserted when root hub is
2104 * suspended or HNP is in progress.
2105 */
2106 pr_debug("!a_bus_req\n");
2107 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002108 dev->phy.state = OTG_STATE_A_SUSPEND;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002109 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002110 if (dev->phy.otg->host->b_hnp_enable) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002111 msm_otg_start_timer(dev, TA_AIDL_BDIS,
2112 A_AIDL_BDIS);
2113 } else {
2114 /* No HNP. Root hub suspended */
2115 msm_otg_put_suspend(dev);
2116 }
2117 if (test_bit(ID_A, &dev->inputs))
Steve Mucklef132c6c2012-06-06 18:30:57 -07002118 msm_otg_set_power(&dev->phy,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002119 USB_IDCHG_MIN - USB_IB_UNCFG);
2120 } else if (!test_bit(B_CONN, &dev->inputs)) {
2121 pr_debug("!b_conn\n");
2122 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002123 dev->phy.state = OTG_STATE_A_WAIT_BCON;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002124 spin_unlock_irqrestore(&dev->lock, flags);
2125 if (TA_WAIT_BCON > 0)
2126 msm_otg_start_timer(dev, TA_WAIT_BCON,
2127 A_WAIT_BCON);
2128 } else if (test_bit(ID_A, &dev->inputs)) {
2129 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
2130 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002131 msm_otg_set_power(&dev->phy,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002132 USB_IDCHG_MIN - get_aca_bmaxpower(dev));
2133 } else if (!test_bit(ID, &dev->inputs)) {
2134 atomic_set(&dev->chg_type, USB_CHG_TYPE__INVALID);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002135 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002136 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2137 }
2138 break;
2139 case OTG_STATE_A_SUSPEND:
2140 if ((test_bit(ID, &dev->inputs) &&
2141 !test_bit(ID_A, &dev->inputs)) ||
2142 test_bit(A_BUS_DROP, &dev->inputs) ||
2143 test_bit(A_AIDL_BDIS, &dev->tmouts)) {
2144 pr_debug("id_f/b/c || a_bus_drop ||"
2145 "a_aidl_bdis_tmout\n");
2146 if (test_bit(A_AIDL_BDIS, &dev->tmouts))
Steve Mucklef132c6c2012-06-06 18:30:57 -07002147 msm_otg_send_event(dev->phy.otg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002148 OTG_EVENT_HNP_FAILED);
2149 msm_otg_del_timer(dev);
2150 clear_bit(B_CONN, &dev->inputs);
2151 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002152 dev->phy.state = OTG_STATE_A_WAIT_VFALL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002153 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002154 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002155 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2156 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002157 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002158 if (!test_bit(ID_A, &dev->inputs))
2159 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2160 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002161 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002162 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2163 pr_debug("!a_vbus_vld\n");
2164 msm_otg_del_timer(dev);
2165 clear_bit(B_CONN, &dev->inputs);
2166 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002167 dev->phy.state = OTG_STATE_A_VBUS_ERR;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002168 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002169 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002170 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002171 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002172 } else if (!test_bit(B_CONN, &dev->inputs) &&
Steve Mucklef132c6c2012-06-06 18:30:57 -07002173 dev->phy.otg->host->b_hnp_enable) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002174 pr_debug("!b_conn && b_hnp_enable");
2175 /* Clear AIDL_BDIS timer */
2176 msm_otg_del_timer(dev);
2177 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002178 dev->phy.state = OTG_STATE_A_PERIPHERAL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002179 spin_unlock_irqrestore(&dev->lock, flags);
2180
Steve Mucklef132c6c2012-06-06 18:30:57 -07002181 msm_otg_start_host(dev->phy.otg, REQUEST_HNP_SUSPEND);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002182
2183 /* We may come here even when B-dev is physically
2184 * disconnected during HNP. We go back to host
2185 * role if bus is idle for BIDL_ADIS time.
2186 */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002187 dev->phy.otg->gadget->is_a_peripheral = 1;
2188 msm_otg_start_peripheral(dev->phy.otg, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002189 /* If ID_A: we can charge in a_peripheral as well */
2190 if (test_bit(ID_A, &dev->inputs)) {
2191 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002192 msm_otg_set_power(&dev->phy,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002193 USB_IDCHG_MIN - USB_IB_UNCFG);
2194 }
2195 } else if (!test_bit(B_CONN, &dev->inputs) &&
Steve Mucklef132c6c2012-06-06 18:30:57 -07002196 !dev->phy.otg->host->b_hnp_enable) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002197 pr_debug("!b_conn && !b_hnp_enable");
2198 /* bus request is dropped during suspend.
2199 * acquire again for next device.
2200 */
2201 set_bit(A_BUS_REQ, &dev->inputs);
2202 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002203 dev->phy.state = OTG_STATE_A_WAIT_BCON;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002204 spin_unlock_irqrestore(&dev->lock, flags);
2205 if (TA_WAIT_BCON > 0)
2206 msm_otg_start_timer(dev, TA_WAIT_BCON,
2207 A_WAIT_BCON);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002208 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002209 } else if (test_bit(ID_A, &dev->inputs)) {
2210 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2211 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002212 msm_otg_set_power(&dev->phy,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002213 USB_IDCHG_MIN - USB_IB_UNCFG);
2214 } else if (!test_bit(ID, &dev->inputs)) {
Steve Mucklef132c6c2012-06-06 18:30:57 -07002215 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002216 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2217 }
2218 break;
2219 case OTG_STATE_A_PERIPHERAL:
2220 if ((test_bit(ID, &dev->inputs) &&
2221 !test_bit(ID_A, &dev->inputs)) ||
2222 test_bit(A_BUS_DROP, &dev->inputs)) {
2223 pr_debug("id _f/b/c || a_bus_drop\n");
2224 /* Clear BIDL_ADIS timer */
2225 msm_otg_del_timer(dev);
2226 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002227 dev->phy.state = OTG_STATE_A_WAIT_VFALL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002228 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002229 msm_otg_start_peripheral(dev->phy.otg, 0);
2230 dev->phy.otg->gadget->is_a_peripheral = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002231 /* HCD was suspended before. Stop it now */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002232 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002233
2234 /* Reset both phy and link */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002235 otg_reset(&dev->phy, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002236 if (!test_bit(ID_A, &dev->inputs))
2237 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2238 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002239 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002240 } else if (!test_bit(A_VBUS_VLD, &dev->inputs)) {
2241 pr_debug("!a_vbus_vld\n");
2242 /* Clear BIDL_ADIS timer */
2243 msm_otg_del_timer(dev);
2244 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002245 dev->phy.state = OTG_STATE_A_VBUS_ERR;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002246 spin_unlock_irqrestore(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002247 msm_otg_start_peripheral(dev->phy.otg, 0);
2248 dev->phy.otg->gadget->is_a_peripheral = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002249 /* HCD was suspended before. Stop it now */
Steve Mucklef132c6c2012-06-06 18:30:57 -07002250 msm_otg_start_host(dev->phy.otg, REQUEST_STOP);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002251 } else if (test_bit(A_BIDL_ADIS, &dev->tmouts)) {
2252 pr_debug("a_bidl_adis_tmout\n");
Steve Mucklef132c6c2012-06-06 18:30:57 -07002253 msm_otg_start_peripheral(dev->phy.otg, 0);
2254 dev->phy.otg->gadget->is_a_peripheral = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002255
2256 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002257 dev->phy.state = OTG_STATE_A_WAIT_BCON;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002258 spin_unlock_irqrestore(&dev->lock, flags);
2259 set_bit(A_BUS_REQ, &dev->inputs);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002260 msm_otg_start_host(dev->phy.otg, REQUEST_HNP_RESUME);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002261 if (TA_WAIT_BCON > 0)
2262 msm_otg_start_timer(dev, TA_WAIT_BCON,
2263 A_WAIT_BCON);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002264 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002265 } else if (test_bit(ID_A, &dev->inputs)) {
2266 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2267 atomic_set(&dev->chg_type, USB_CHG_TYPE__SDP);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002268 msm_otg_set_power(&dev->phy,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002269 USB_IDCHG_MIN - USB_IB_UNCFG);
2270 } else if (!test_bit(ID, &dev->inputs)) {
Steve Mucklef132c6c2012-06-06 18:30:57 -07002271 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002272 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 1);
2273 }
2274 break;
2275 case OTG_STATE_A_WAIT_VFALL:
2276 if (test_bit(A_WAIT_VFALL, &dev->tmouts)) {
2277 clear_bit(A_VBUS_VLD, &dev->inputs);
2278 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002279 dev->phy.state = OTG_STATE_A_IDLE;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002280 spin_unlock_irqrestore(&dev->lock, flags);
2281 work = 1;
2282 }
2283 break;
2284 case OTG_STATE_A_VBUS_ERR:
2285 if ((test_bit(ID, &dev->inputs) &&
2286 !test_bit(ID_A, &dev->inputs)) ||
2287 test_bit(A_BUS_DROP, &dev->inputs) ||
2288 test_bit(A_CLR_ERR, &dev->inputs)) {
2289 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002290 dev->phy.state = OTG_STATE_A_WAIT_VFALL;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002291 spin_unlock_irqrestore(&dev->lock, flags);
2292 if (!test_bit(ID_A, &dev->inputs))
2293 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2294 msm_otg_start_timer(dev, TA_WAIT_VFALL, A_WAIT_VFALL);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002295 msm_otg_set_power(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002296 }
2297 break;
2298 default:
2299 pr_err("invalid OTG state\n");
2300 }
2301
2302 if (work)
2303 queue_work(dev->wq, &dev->sm_work);
2304
2305#ifdef CONFIG_USB_MSM_ACA
2306 /* Start id_polling if (ID_FLOAT&BSV) || ID_A/B/C */
2307 if ((test_bit(ID, &dev->inputs) &&
2308 test_bit(B_SESS_VLD, &dev->inputs) &&
2309 chg_type != USB_CHG_TYPE__WALLCHARGER) ||
2310 test_bit(ID_A, &dev->inputs)) {
2311 mod_timer(&dev->id_timer, jiffies +
2312 msecs_to_jiffies(OTG_ID_POLL_MS));
2313 return;
2314 }
2315 del_timer(&dev->id_timer);
2316#endif
2317 /* IRQ/sysfs may queue work. Check work_pending. otherwise
2318 * we might endup releasing wakelock after it is acquired
2319 * in IRQ/sysfs.
2320 */
2321 if (!work_pending(&dev->sm_work) && !hrtimer_active(&dev->timer) &&
2322 !work_pending(&dev->otg_resume_work))
2323 wake_unlock(&dev->wlock);
2324}
2325
2326#ifdef CONFIG_USB_MSM_ACA
2327static void msm_otg_id_func(unsigned long _dev)
2328{
2329 struct msm_otg *dev = (struct msm_otg *) _dev;
2330 u8 phy_ints;
2331
2332#ifdef CONFIG_USB_MSM_STANDARD_ACA
2333 /*
2334 * When standard ACA is attached RID_A and RID_GND states are only
2335 * possible. RID_A-->RID_GND transition generates IdGnd interrupt
2336 * from PHY. Hence polling is disabled.
2337 */
2338 if (test_bit(ID_A, &dev->inputs))
2339 goto out;
2340#endif
2341
2342 if (atomic_read(&dev->in_lpm))
Steve Mucklef132c6c2012-06-06 18:30:57 -07002343 msm_otg_set_suspend(&dev->phy, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002344
2345 phy_ints = ulpi_read(dev, 0x13);
2346
2347 /*
2348 * ACA timer will be kicked again after the PHY
2349 * state is recovered.
2350 */
2351 if (phy_ints == -ETIMEDOUT)
2352 return;
2353
2354
2355 /* If id_gnd happened then stop and let isr take care of this */
2356 if (phy_id_state_gnd(phy_ints))
2357 goto out;
2358
2359 if ((test_bit(ID_A, &dev->inputs) == phy_id_state_a(phy_ints)) &&
2360 (test_bit(ID_B, &dev->inputs) == phy_id_state_b(phy_ints)) &&
2361 (test_bit(ID_C, &dev->inputs) == phy_id_state_c(phy_ints))) {
2362 mod_timer(&dev->id_timer,
2363 jiffies + msecs_to_jiffies(OTG_ID_POLL_MS));
2364 goto out;
2365 } else {
2366 set_aca_id_inputs(dev);
2367 }
2368 wake_lock(&dev->wlock);
2369 queue_work(dev->wq, &dev->sm_work);
2370out:
2371 /* OOPS: runing while !BSV, schedule work to initiate LPM */
2372 if (!is_b_sess_vld()) {
2373 clear_bit(B_SESS_VLD, &dev->inputs);
2374 wake_lock(&dev->wlock);
2375 queue_work(dev->wq, &dev->sm_work);
2376 }
2377 return;
2378}
2379#endif
2380#ifdef CONFIG_USB_OTG
2381static ssize_t
2382set_pwr_down(struct device *_dev, struct device_attribute *attr,
2383 const char *buf, size_t count)
2384{
2385 struct msm_otg *dev = the_msm_otg;
2386 int value;
2387 enum usb_otg_state state;
2388 unsigned long flags;
2389
2390 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002391 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002392 spin_unlock_irqrestore(&dev->lock, flags);
2393
2394 /* Applicable for only A-Device */
2395 if (state <= OTG_STATE_A_IDLE)
2396 return -EINVAL;
2397
2398 sscanf(buf, "%d", &value);
2399
2400 if (test_bit(A_BUS_DROP, &dev->inputs) != !!value) {
2401 change_bit(A_BUS_DROP, &dev->inputs);
2402 wake_lock(&dev->wlock);
2403 queue_work(dev->wq, &dev->sm_work);
2404 }
2405
2406 return count;
2407}
2408static DEVICE_ATTR(pwr_down, S_IRUGO | S_IWUSR, NULL, set_pwr_down);
2409
2410static ssize_t
2411set_srp_req(struct device *_dev, struct device_attribute *attr,
2412 const char *buf, size_t count)
2413{
2414 struct msm_otg *dev = the_msm_otg;
2415 enum usb_otg_state state;
2416 unsigned long flags;
2417
2418 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002419 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002420 spin_unlock_irqrestore(&dev->lock, flags);
2421
2422 if (state != OTG_STATE_B_IDLE)
2423 return -EINVAL;
2424
2425 set_bit(B_BUS_REQ, &dev->inputs);
2426 wake_lock(&dev->wlock);
2427 queue_work(dev->wq, &dev->sm_work);
2428
2429 return count;
2430}
2431static DEVICE_ATTR(srp_req, S_IRUGO | S_IWUSR, NULL, set_srp_req);
2432
2433static ssize_t
2434set_clr_err(struct device *_dev, struct device_attribute *attr,
2435 const char *buf, size_t count)
2436{
2437 struct msm_otg *dev = the_msm_otg;
2438 enum usb_otg_state state;
2439 unsigned long flags;
2440
2441 spin_lock_irqsave(&dev->lock, flags);
Steve Mucklef132c6c2012-06-06 18:30:57 -07002442 state = dev->phy.state;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002443 spin_unlock_irqrestore(&dev->lock, flags);
2444
2445 if (state == OTG_STATE_A_VBUS_ERR) {
2446 set_bit(A_CLR_ERR, &dev->inputs);
2447 wake_lock(&dev->wlock);
2448 queue_work(dev->wq, &dev->sm_work);
2449 }
2450
2451 return count;
2452}
2453static DEVICE_ATTR(clr_err, S_IRUGO | S_IWUSR, NULL, set_clr_err);
2454
2455static struct attribute *msm_otg_attrs[] = {
2456 &dev_attr_pwr_down.attr,
2457 &dev_attr_srp_req.attr,
2458 &dev_attr_clr_err.attr,
2459 NULL,
2460};
2461
2462static struct attribute_group msm_otg_attr_grp = {
2463 .attrs = msm_otg_attrs,
2464};
2465#endif
2466
2467#ifdef CONFIG_DEBUG_FS
2468static int otg_open(struct inode *inode, struct file *file)
2469{
2470 file->private_data = inode->i_private;
2471 return 0;
2472}
2473static ssize_t otg_mode_write(struct file *file, const char __user *buf,
2474 size_t count, loff_t *ppos)
2475{
2476 struct msm_otg *dev = file->private_data;
2477 int ret = count;
2478 int work = 0;
2479 unsigned long flags;
2480
2481 spin_lock_irqsave(&dev->lock, flags);
2482 dev->pdata->otg_mode = OTG_USER_CONTROL;
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05302483 if (!memcmp(buf, "none", 4)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002484 clear_bit(B_SESS_VLD, &dev->inputs);
2485 set_bit(ID, &dev->inputs);
2486 work = 1;
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05302487 } else if (!memcmp(buf, "peripheral", 10)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002488 set_bit(B_SESS_VLD, &dev->inputs);
2489 set_bit(ID, &dev->inputs);
2490 work = 1;
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05302491 } else if (!memcmp(buf, "host", 4)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002492 clear_bit(B_SESS_VLD, &dev->inputs);
2493 clear_bit(ID, &dev->inputs);
2494 set_bit(A_BUS_REQ, &dev->inputs);
2495 work = 1;
2496 } else {
2497 pr_info("%s: unknown mode specified\n", __func__);
2498 ret = -EINVAL;
2499 }
2500 spin_unlock_irqrestore(&dev->lock, flags);
2501
2502 if (work) {
2503 wake_lock(&dev->wlock);
2504 queue_work(dev->wq, &dev->sm_work);
2505 }
2506
2507 return ret;
2508}
2509const struct file_operations otgfs_fops = {
2510 .open = otg_open,
2511 .write = otg_mode_write,
2512};
2513
2514#define OTG_INFO_SIZE 512
2515static ssize_t otg_info_read(struct file *file, char __user *ubuf,
2516 size_t count, loff_t *ppos)
2517{
2518 char *buf;
2519 int temp = 0;
2520 int ret;
2521 struct msm_otg *dev = file->private_data;
2522
2523 buf = kzalloc(sizeof(char) * OTG_INFO_SIZE, GFP_KERNEL);
2524 if (!buf)
2525 return -ENOMEM;
2526
2527 temp += scnprintf(buf + temp, OTG_INFO_SIZE - temp,
2528 "OTG State: %s\n"
2529 "OTG Mode: %d\n"
2530 "OTG Inputs: 0x%lx\n"
2531 "Charger Type: %d\n"
2532 "PMIC VBUS Support: %u\n"
2533 "PMIC ID Support: %u\n"
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002534 "USB In SPS: %d\n"
2535 "pre_emphasis_level: 0x%x\n"
2536 "cdr_auto_reset: 0x%x\n"
2537 "hs_drv_amplitude: 0x%x\n"
2538 "se1_gate_state: 0x%x\n"
2539 "swfi_latency: 0x%x\n"
Manu Gautam5143b252012-01-05 19:25:23 -08002540 "PHY Powercollapse: 0x%x\n",
Steve Mucklef132c6c2012-06-06 18:30:57 -07002541 state_string(dev->phy.state),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002542 dev->pdata->otg_mode,
2543 dev->inputs,
2544 atomic_read(&dev->chg_type),
2545 dev->pmic_vbus_notif_supp,
2546 dev->pmic_id_notif_supp,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002547 dev->pdata->usb_in_sps,
2548 dev->pdata->pemp_level,
2549 dev->pdata->cdr_autoreset,
2550 dev->pdata->drv_ampl,
2551 dev->pdata->se1_gating,
2552 dev->pdata->swfi_latency,
Manu Gautam5143b252012-01-05 19:25:23 -08002553 dev->pdata->phy_can_powercollapse);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002554
2555 ret = simple_read_from_buffer(ubuf, count, ppos, buf, temp);
2556
2557 kfree(buf);
2558
2559 return ret;
2560}
2561
2562const struct file_operations otgfs_info_fops = {
2563 .open = otg_open,
2564 .read = otg_info_read,
2565};
2566
2567struct dentry *otg_debug_root;
2568struct dentry *otg_debug_mode;
2569struct dentry *otg_debug_info;
2570#endif
2571
2572static int otg_debugfs_init(struct msm_otg *dev)
2573{
2574#ifdef CONFIG_DEBUG_FS
2575 otg_debug_root = debugfs_create_dir("otg", NULL);
2576 if (!otg_debug_root)
2577 return -ENOENT;
2578
2579 otg_debug_mode = debugfs_create_file("mode", 0222,
2580 otg_debug_root, dev,
2581 &otgfs_fops);
2582 if (!otg_debug_mode)
2583 goto free_root;
2584
2585 otg_debug_info = debugfs_create_file("info", 0444,
2586 otg_debug_root, dev,
2587 &otgfs_info_fops);
2588 if (!otg_debug_info)
2589 goto free_mode;
2590
2591 return 0;
2592
2593free_mode:
2594 debugfs_remove(otg_debug_mode);
2595 otg_debug_mode = NULL;
2596
2597free_root:
2598 debugfs_remove(otg_debug_root);
2599 otg_debug_root = NULL;
2600 return -ENOENT;
2601#endif
2602 return 0;
2603}
2604
2605static void otg_debugfs_cleanup(void)
2606{
2607#ifdef CONFIG_DEBUG_FS
2608 debugfs_remove(otg_debug_info);
2609 debugfs_remove(otg_debug_mode);
2610 debugfs_remove(otg_debug_root);
2611#endif
2612}
2613
Steve Mucklef132c6c2012-06-06 18:30:57 -07002614struct usb_phy_io_ops msm_otg_io_ops = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002615 .read = usb_ulpi_read,
2616 .write = usb_ulpi_write,
James Sullins0ada9672013-12-25 17:12:35 -06002617#ifdef CONFIG_USB_MULTIPLE_CHARGER_DETECT
2618 .read_with_reset = usb_ulpi_read_with_reset,
2619 .write_with_reset = usb_ulpi_write_with_reset,
2620#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002621};
2622
2623static int __init msm_otg_probe(struct platform_device *pdev)
2624{
2625 int ret = 0;
2626 struct resource *res;
2627 struct msm_otg *dev;
2628
2629 dev = kzalloc(sizeof(struct msm_otg), GFP_KERNEL);
2630 if (!dev)
2631 return -ENOMEM;
2632
Steve Mucklef132c6c2012-06-06 18:30:57 -07002633 dev->phy.otg = kzalloc(sizeof(struct usb_otg), GFP_KERNEL);
2634 if (!dev->phy.otg) {
2635 kfree(dev);
2636 return -ENOMEM;
2637 }
2638
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002639 the_msm_otg = dev;
Steve Mucklef132c6c2012-06-06 18:30:57 -07002640 dev->phy.dev = &pdev->dev;
2641 dev->phy.otg->phy = &dev->phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002642 dev->pdata = pdev->dev.platform_data;
2643
2644 if (!dev->pdata) {
2645 ret = -ENODEV;
2646 goto free_dev;
2647 }
2648
2649#ifdef CONFIG_USB_EHCI_MSM_72K
2650 if (!dev->pdata->vbus_power) {
2651 ret = -ENODEV;
2652 goto free_dev;
2653 } else
2654 dev->pdata->vbus_power(USB_PHY_INTEGRATED, 0);
2655
2656#endif
2657
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002658 if (dev->pdata->rpc_connect) {
2659 ret = dev->pdata->rpc_connect(1);
2660 pr_debug("%s: rpc_connect(%d)\n", __func__, ret);
2661 if (ret) {
2662 pr_err("%s: rpc connect failed\n", __func__);
2663 ret = -ENODEV;
2664 goto free_dev;
2665 }
2666 }
2667
Manu Gautam5143b252012-01-05 19:25:23 -08002668 dev->alt_core_clk = clk_get(&pdev->dev, "alt_core_clk");
2669 if (IS_ERR(dev->alt_core_clk)) {
2670 pr_err("%s: failed to get alt_core_clk\n", __func__);
2671 ret = PTR_ERR(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002672 goto rpc_fail;
2673 }
Manu Gautam5143b252012-01-05 19:25:23 -08002674 clk_set_rate(dev->alt_core_clk, 60000000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002675
2676 /* pm qos request to prevent apps idle power collapse */
2677 pm_qos_add_request(&dev->pdata->pm_qos_req_dma, PM_QOS_CPU_DMA_LATENCY,
2678 PM_QOS_DEFAULT_VALUE);
2679
Manu Gautam5143b252012-01-05 19:25:23 -08002680 dev->core_clk = clk_get(&pdev->dev, "core_clk");
2681 if (IS_ERR(dev->core_clk)) {
2682 pr_err("%s: failed to get core_clk\n", __func__);
2683 ret = PTR_ERR(dev->core_clk);
2684 goto put_alt_core_clk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002685 }
Manu Gautam5143b252012-01-05 19:25:23 -08002686 /* CORE clk must be running at >60Mhz for correct HSUSB operation
2687 * and USB core cannot tolerate frequency changes on CORE CLK.
2688 * Vote for maximum clk frequency for CORE clock.
2689 */
2690 clk_set_rate(dev->core_clk, INT_MAX);
2691
Manu Gautam28b1bac2012-01-30 16:43:06 +05302692 clk_prepare_enable(dev->core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002693
2694 if (!dev->pdata->pclk_is_hw_gated) {
Manu Gautam5143b252012-01-05 19:25:23 -08002695 dev->iface_clk = clk_get(&pdev->dev, "iface_clk");
2696 if (IS_ERR(dev->iface_clk)) {
2697 pr_err("%s: failed to get abh_clk\n", __func__);
2698 ret = PTR_ERR(dev->iface_clk);
2699 goto put_core_clk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002700 }
Manu Gautam28b1bac2012-01-30 16:43:06 +05302701 clk_prepare_enable(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002702 }
2703
2704 if (!dev->pdata->phy_reset) {
Manu Gautam5143b252012-01-05 19:25:23 -08002705 dev->phy_reset_clk = clk_get(&pdev->dev, "phy_clk");
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002706 if (IS_ERR(dev->phy_reset_clk)) {
Manu Gautam5143b252012-01-05 19:25:23 -08002707 pr_err("%s: failed to get phy_clk\n", __func__);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002708 ret = PTR_ERR(dev->phy_reset_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002709 goto put_iface_clk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002710 }
2711 }
2712
2713 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2714 if (!res) {
2715 pr_err("%s: failed to get platform resource mem\n", __func__);
2716 ret = -ENODEV;
2717 goto put_phy_clk;
2718 }
2719
2720 dev->regs = ioremap(res->start, resource_size(res));
2721 if (!dev->regs) {
2722 pr_err("%s: ioremap failed\n", __func__);
2723 ret = -ENOMEM;
2724 goto put_phy_clk;
2725 }
2726 dev->irq = platform_get_irq(pdev, 0);
2727 if (!dev->irq) {
2728 pr_err("%s: platform_get_irq failed\n", __func__);
2729 ret = -ENODEV;
2730 goto free_regs;
2731 }
2732 dev->xo_handle = msm_xo_get(MSM_XO_TCXO_D1, "usb");
2733 if (IS_ERR(dev->xo_handle)) {
2734 pr_err(" %s not able to get the handle"
2735 "to vote for TCXO D1 buffer\n", __func__);
2736 ret = PTR_ERR(dev->xo_handle);
2737 goto free_regs;
2738 }
2739
2740 ret = msm_xo_mode_vote(dev->xo_handle, MSM_XO_MODE_ON);
2741 if (ret) {
2742 pr_err("%s failed to vote for TCXO"
2743 "D1 buffer%d\n", __func__, ret);
2744 goto free_xo_handle;
2745 }
2746
2747
2748 msm_otg_init_timer(dev);
2749 INIT_WORK(&dev->sm_work, msm_otg_sm_work);
2750 INIT_WORK(&dev->otg_resume_work, msm_otg_resume_w);
2751 spin_lock_init(&dev->lock);
2752 wake_lock_init(&dev->wlock, WAKE_LOCK_SUSPEND, "msm_otg");
2753
2754 dev->wq = alloc_workqueue("k_otg", WQ_NON_REENTRANT, 0);
2755 if (!dev->wq) {
2756 ret = -ENOMEM;
2757 goto free_wlock;
2758 }
2759
2760 if (dev->pdata->init_gpio) {
2761 ret = dev->pdata->init_gpio(1);
2762 if (ret) {
2763 pr_err("%s: gpio init failed with err:%d\n",
2764 __func__, ret);
2765 goto free_wq;
2766 }
2767 }
2768 /* To reduce phy power consumption and to avoid external LDO
2769 * on the board, PMIC comparators can be used to detect VBUS
2770 * session change.
2771 */
2772 if (dev->pdata->pmic_vbus_notif_init) {
2773 ret = dev->pdata->pmic_vbus_notif_init
2774 (&msm_otg_set_vbus_state, 1);
2775 if (!ret) {
2776 dev->pmic_vbus_notif_supp = 1;
2777 } else if (ret != -ENOTSUPP) {
2778 pr_err("%s: pmic_vbus_notif_init() failed, err:%d\n",
2779 __func__, ret);
2780 goto free_gpio;
2781 }
2782 }
2783
Anji jonnalaae745e92011-11-14 18:34:31 +05302784 if (dev->pdata->phy_id_setup_init) {
2785 ret = dev->pdata->phy_id_setup_init(1);
2786 if (ret) {
2787 pr_err("%s: phy_id_setup_init failed err:%d",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002788 __func__, ret);
2789 goto free_pmic_vbus_notif;
2790 }
2791 }
2792
2793 if (dev->pdata->pmic_vbus_irq)
2794 dev->vbus_on_irq = dev->pdata->pmic_vbus_irq;
2795
2796 /* vote for vddcx, as PHY cannot tolerate vddcx below 1.0V */
2797 if (dev->pdata->init_vddcx) {
2798 ret = dev->pdata->init_vddcx(1);
2799 if (ret) {
2800 pr_err("%s: unable to enable vddcx digital core:%d\n",
2801 __func__, ret);
Anji jonnalaae745e92011-11-14 18:34:31 +05302802 goto free_phy_id_setup;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002803 }
2804 }
2805
2806 if (dev->pdata->ldo_init) {
2807 ret = dev->pdata->ldo_init(1);
2808 if (ret) {
2809 pr_err("%s: ldo_init failed with err:%d\n",
2810 __func__, ret);
2811 goto free_config_vddcx;
2812 }
2813 }
2814
2815 if (dev->pdata->ldo_enable) {
2816 ret = dev->pdata->ldo_enable(1);
2817 if (ret) {
2818 pr_err("%s: ldo_enable failed with err:%d\n",
2819 __func__, ret);
2820 goto free_ldo_init;
2821 }
2822 }
2823
2824
2825 /* ACk all pending interrupts and clear interrupt enable registers */
2826 writel((readl(USB_OTGSC) & ~OTGSC_INTR_MASK), USB_OTGSC);
2827 writel(readl(USB_USBSTS), USB_USBSTS);
2828 writel(0, USB_USBINTR);
2829 /* Ensure that above STOREs are completed before enabling interrupts */
2830 mb();
2831
2832 ret = request_irq(dev->irq, msm_otg_irq, IRQF_SHARED,
2833 "msm_otg", dev);
2834 if (ret) {
2835 pr_err("%s: request irq failed\n", __func__);
2836 goto free_ldo_enable;
2837 }
2838
Steve Mucklef132c6c2012-06-06 18:30:57 -07002839 dev->phy.set_suspend = msm_otg_set_suspend;
2840 dev->phy.set_power = msm_otg_set_power;
2841
2842 dev->phy.otg->set_peripheral = msm_otg_set_peripheral;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002843#ifdef CONFIG_USB_EHCI_MSM_72K
Steve Mucklef132c6c2012-06-06 18:30:57 -07002844 dev->phy.otg->set_host = msm_otg_set_host;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002845#endif
Steve Mucklef132c6c2012-06-06 18:30:57 -07002846 dev->phy.otg->start_hnp = msm_otg_start_hnp;
2847 dev->phy.otg->send_event = msm_otg_send_event;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002848 dev->set_clk = msm_otg_set_clk;
2849 dev->reset = otg_reset;
Steve Mucklef132c6c2012-06-06 18:30:57 -07002850 dev->phy.io_ops = &msm_otg_io_ops;
2851 if (usb_set_transceiver(&dev->phy)) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002852 WARN_ON(1);
2853 goto free_otg_irq;
2854 }
2855#ifdef CONFIG_USB_MSM_ACA
2856 /* Link doesnt support id_a/b/c interrupts, hence polling
2857 * needs to be done to support ACA charger
2858 */
2859 init_timer(&dev->id_timer);
2860 dev->id_timer.function = msm_otg_id_func;
2861 dev->id_timer.data = (unsigned long) dev;
2862#endif
2863
2864 atomic_set(&dev->chg_type, USB_CHG_TYPE__INVALID);
2865 if (dev->pdata->chg_init && dev->pdata->chg_init(1))
2866 pr_err("%s: chg_init failed\n", __func__);
2867
2868 device_init_wakeup(&pdev->dev, 1);
2869
2870 ret = pm_runtime_set_active(&pdev->dev);
2871 if (ret < 0)
2872 pr_err("%s: pm_runtime: Fail to set active\n", __func__);
2873
2874 ret = 0;
2875 pm_runtime_enable(&pdev->dev);
2876 pm_runtime_get(&pdev->dev);
2877
2878
2879 ret = otg_debugfs_init(dev);
2880 if (ret) {
2881 pr_err("%s: otg_debugfs_init failed\n", __func__);
2882 goto chg_deinit;
2883 }
2884
2885#ifdef CONFIG_USB_OTG
2886 ret = sysfs_create_group(&pdev->dev.kobj, &msm_otg_attr_grp);
2887 if (ret < 0) {
2888 pr_err("%s: Failed to create the sysfs entry\n", __func__);
2889 otg_debugfs_cleanup();
2890 goto chg_deinit;
2891 }
2892#endif
2893
2894
2895 return 0;
2896
2897chg_deinit:
2898 if (dev->pdata->chg_init)
2899 dev->pdata->chg_init(0);
2900free_otg_irq:
2901 free_irq(dev->irq, dev);
2902free_ldo_enable:
2903 if (dev->pdata->ldo_enable)
2904 dev->pdata->ldo_enable(0);
2905 if (dev->pdata->setup_gpio)
2906 dev->pdata->setup_gpio(USB_SWITCH_DISABLE);
2907free_ldo_init:
2908 if (dev->pdata->ldo_init)
2909 dev->pdata->ldo_init(0);
2910free_config_vddcx:
2911 if (dev->pdata->init_vddcx)
2912 dev->pdata->init_vddcx(0);
Anji jonnalaae745e92011-11-14 18:34:31 +05302913free_phy_id_setup:
2914 if (dev->pdata->phy_id_setup_init)
2915 dev->pdata->phy_id_setup_init(0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002916free_pmic_vbus_notif:
2917 if (dev->pdata->pmic_vbus_notif_init && dev->pmic_vbus_notif_supp)
2918 dev->pdata->pmic_vbus_notif_init(&msm_otg_set_vbus_state, 0);
2919free_gpio:
2920 if (dev->pdata->init_gpio)
2921 dev->pdata->init_gpio(0);
2922free_wq:
2923 destroy_workqueue(dev->wq);
2924free_wlock:
2925 wake_lock_destroy(&dev->wlock);
2926free_xo_handle:
2927 msm_xo_put(dev->xo_handle);
2928free_regs:
2929 iounmap(dev->regs);
2930put_phy_clk:
2931 if (dev->phy_reset_clk)
2932 clk_put(dev->phy_reset_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002933put_iface_clk:
2934 if (dev->iface_clk) {
Manu Gautam28b1bac2012-01-30 16:43:06 +05302935 clk_disable_unprepare(dev->iface_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002936 clk_put(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002937 }
Manu Gautam5143b252012-01-05 19:25:23 -08002938put_core_clk:
Manu Gautam28b1bac2012-01-30 16:43:06 +05302939 clk_disable_unprepare(dev->core_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002940 clk_put(dev->core_clk);
2941put_alt_core_clk:
2942 clk_put(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002943rpc_fail:
2944 if (dev->pdata->rpc_connect)
2945 dev->pdata->rpc_connect(0);
2946free_dev:
Steve Mucklef132c6c2012-06-06 18:30:57 -07002947 kfree(dev->phy.otg);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002948 kfree(dev);
2949 return ret;
2950}
2951
2952static int __exit msm_otg_remove(struct platform_device *pdev)
2953{
2954 struct msm_otg *dev = the_msm_otg;
2955
2956 otg_debugfs_cleanup();
2957#ifdef CONFIG_USB_OTG
2958 sysfs_remove_group(&pdev->dev.kobj, &msm_otg_attr_grp);
2959#endif
2960 destroy_workqueue(dev->wq);
2961 wake_lock_destroy(&dev->wlock);
2962
2963 if (dev->pdata->setup_gpio)
2964 dev->pdata->setup_gpio(USB_SWITCH_DISABLE);
2965
2966 if (dev->pdata->init_vddcx)
2967 dev->pdata->init_vddcx(0);
2968 if (dev->pdata->ldo_enable)
2969 dev->pdata->ldo_enable(0);
2970
2971 if (dev->pdata->ldo_init)
2972 dev->pdata->ldo_init(0);
2973
2974 if (dev->pmic_vbus_notif_supp)
2975 dev->pdata->pmic_vbus_notif_init(&msm_otg_set_vbus_state, 0);
2976
Anji jonnalaae745e92011-11-14 18:34:31 +05302977 if (dev->pdata->phy_id_setup_init)
2978 dev->pdata->phy_id_setup_init(0);
2979
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002980 if (dev->pmic_id_notif_supp)
2981 dev->pdata->pmic_id_notif_init(&msm_otg_set_id_state, 0);
2982
2983#ifdef CONFIG_USB_MSM_ACA
2984 del_timer_sync(&dev->id_timer);
2985#endif
2986 if (dev->pdata->chg_init)
2987 dev->pdata->chg_init(0);
2988 free_irq(dev->irq, pdev);
2989 iounmap(dev->regs);
Manu Gautam28b1bac2012-01-30 16:43:06 +05302990 clk_disable_unprepare(dev->core_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002991 clk_put(dev->core_clk);
2992 if (dev->iface_clk) {
Manu Gautam28b1bac2012-01-30 16:43:06 +05302993 clk_disable_unprepare(dev->iface_clk);
Manu Gautam5143b252012-01-05 19:25:23 -08002994 clk_put(dev->iface_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002995 }
Manu Gautam5143b252012-01-05 19:25:23 -08002996 if (dev->alt_core_clk)
2997 clk_put(dev->alt_core_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002998 if (dev->phy_reset_clk)
2999 clk_put(dev->phy_reset_clk);
3000 if (dev->pdata->rpc_connect)
3001 dev->pdata->rpc_connect(0);
3002 msm_xo_put(dev->xo_handle);
Pavankumar Kondetif0f95d82011-09-23 11:38:57 +05303003 pm_qos_remove_request(&dev->pdata->pm_qos_req_dma);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003004
3005 pm_runtime_put(&pdev->dev);
3006 pm_runtime_disable(&pdev->dev);
Steve Mucklef132c6c2012-06-06 18:30:57 -07003007 kfree(dev->phy.otg);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003008 kfree(dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003009 return 0;
3010}
3011
3012static int msm_otg_runtime_suspend(struct device *dev)
3013{
3014 struct msm_otg *otg = the_msm_otg;
3015
3016 dev_dbg(dev, "pm_runtime: suspending...\n");
3017 msm_otg_suspend(otg);
3018 return 0;
3019}
3020
3021static int msm_otg_runtime_resume(struct device *dev)
3022{
3023 struct msm_otg *otg = the_msm_otg;
3024
3025 dev_dbg(dev, "pm_runtime: resuming...\n");
3026 msm_otg_resume(otg);
3027 return 0;
3028}
3029
3030static int msm_otg_runtime_idle(struct device *dev)
3031{
3032 dev_dbg(dev, "pm_runtime: idling...\n");
3033 return 0;
3034}
3035
3036static struct dev_pm_ops msm_otg_dev_pm_ops = {
3037 .runtime_suspend = msm_otg_runtime_suspend,
3038 .runtime_resume = msm_otg_runtime_resume,
3039 .runtime_idle = msm_otg_runtime_idle,
3040};
3041
3042static struct platform_driver msm_otg_driver = {
3043 .remove = __exit_p(msm_otg_remove),
3044 .driver = {
3045 .name = DRIVER_NAME,
3046 .owner = THIS_MODULE,
3047 .pm = &msm_otg_dev_pm_ops,
3048 },
3049};
3050
3051static int __init msm_otg_init(void)
3052{
3053 return platform_driver_probe(&msm_otg_driver, msm_otg_probe);
3054}
3055
3056static void __exit msm_otg_exit(void)
3057{
3058 platform_driver_unregister(&msm_otg_driver);
3059}
3060
3061module_init(msm_otg_init);
3062module_exit(msm_otg_exit);
3063
3064MODULE_LICENSE("GPL v2");
3065MODULE_DESCRIPTION("MSM usb transceiver driver");
3066MODULE_VERSION("1.00");