blob: 8ba67a59ddd24141412c5e5de753788ffa993595 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * (C) Copyright 2013
3 * Marvell Semiconductor <www.marvell.com>
4 * Leo Song <liangs@marvell.com>
5 * Yi Zhang <yizhang@marvell.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0+
8 */
9
10#include <common.h>
11#include <asm/io.h>
12#include <asm/arch/config.h>
13#include <usb.h>
14#include <linux/usb/mv-phy.h>
15#include <asm/arch/cpu.h>
16#include <errno.h>
17
18#ifdef CONFIG_ASR_USB3_PHY
19#include "dwc3_regs.h"
20
21#define APMU_REG_BASE (0xd4282800)
22#define APBSPARE_REG_BASE (0xd4090000)
23#define EVENT_BUFF_SIZE (128)
24#define DWC3_LOCAL_REG_OFFSET (0x10000)
25#define DWC3_USB2_DEBUG_REG (0x4C)
26#define APMU_SD_ROT_WAKE_CLR (0xd4282800 + 0x7c)
27#define ASR190X_APMU_LINE_STAT (0xd4282800 + 0x118)
28#define PMUA_RTERM_CAL_REG (0x3f8)
29#define APB_SPARE_REG24 (0x15c)
30#define USB_VBUS_STS (0x1 << 2)
31
32__weak void dwc3_force_usb2_mode(void) {}
33
34#ifdef CONFIG_ASR1901
35static int dwc3_charger_get_vbus(unsigned int *level)
36{
37 if (readl(ASR190X_APMU_LINE_STAT) & USB_VBUS_STS)
38 *level = 1;
39 else
40 *level = 0;
41 return 0;
42}
43#else
44static int dwc3_charger_get_vbus(unsigned int *level)
45{
46 if (readl(APMU_SD_ROT_WAKE_CLR) & (0x1 << 15))
47 *level = 1;
48 else
49 *level = 0;
50 return 0;
51}
52#endif
53
54static void dump_phy_regs(u32 base)
55{
56 int i;
57 u32 tmp32;
58 for (i = 0; i < 0x450; i++) {
59 tmp32 = readl((uintptr_t)base + i * 4);
60 printf("[0x%x] = 0x%x\t", (base + i * 4), tmp32);
61 if (i % 5 == 0)
62 printf("\n");
63 }
64}
65
66static int asr_usbphy_dpdm_pulldown(u32 base, bool enable)
67{
68
69 u32 reg32;
70
71 if (enable) {
72 reg32 = readl(base + USB2_PHY0_REG25);
73 reg32 &= ~(PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_MASK);
74 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_VAL2;
75 writel(reg32, base + USB2_PHY0_REG25);
76
77 /* pullup dp and pulldown dm */
78 reg32 = readl(base + USB2_PHY0_REG29);
79 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
80 writel(reg32, base + USB2_PHY0_REG29);
81 } else {
82 /* disable pullup dp and pulldown dm */
83 reg32 = readl(base + USB2_PHY0_REG29);
84 reg32 &= (~PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN);
85 writel(reg32, base + USB2_PHY0_REG29);
86 }
87}
88#ifdef CONFIG_ASR1901
89static void asr1901_a0_rterm_cal_porta(u32 base)
90{
91 u32 regval, regval2;
92 u32 apmu_base = APMU_REG_BASE;
93
94 printf("RTERM Test for ASR1901 a0+\n");
95 if (!(readl(base + PUPHY_REG20) & (0x1 << 24))) {
96 printf("skip lane0 rterm calibration: 0x%x\n", readl(base + PUPHY_REG20));
97 return;
98 }
99
100 /* pll_reg2 set to 0xC0 */
101 writel(((readl(base + PUPHY_REG16) & 0xFFFF00FF) | 0xC000), base + PUPHY_REG16);
102
103 /* pll_reg7[5] of lane0, disable select refclk_100_n/p 100Mhz input */
104 writel((readl(base + PUPHY_REG17) & (~(0x1<<21))), base + PUPHY_REG17);
105
106 regval = readl(base + PUPHY_REG11);
107 writel((regval & 0xFFFF0000) | (0x13CB), base + PUPHY_REG11);
108
109 regval = readl(apmu_base + PMUA_RTERM_CAL_REG);
110 if ((regval & (0x1 << 24)) != 0) {
111 printf("USB31 RTERM Done: 0x%x\n", regval);
112 } else {
113 regval = 0xCB00; /* default manu rterm value */
114 printf("!!!set manu reterm: 0x%x\n", regval);
115 }
116
117 regval2 = readl(base + PUPHY_REG11);
118 writel(((regval2 & 0xFFFFFF00) | ((regval & 0xFF00) >> 8)), base + PUPHY_REG11);
119
120 /* set force_rc_calib */
121 writel(readl(base + PUPHY_REG1E) | (0x1 << 1), base + PUPHY_REG1E);
122}
123
124static void asr1906_rterm_cal_porta(u32 base)
125{
126 u32 regval;
127 int timeout;
128 bool rc_restared = false;
129 u32 apbs_base = APBSPARE_REG_BASE;
130
131do_reterm_cal:
132 printf("RTERM Test for ASR1906\n");
133 if (!(readl(base + PUPHY_REG20) & (0x1 << 24))) {
134 printf("skip lane0 rterm calibration: 0x%x\n", readl(base + PUPHY_REG20));
135 return;
136 }
137
138 timeout = 100;
139 while (timeout--) {
140 regval = readl(base + PUPHY_REG21);
141 if ((regval & (0x3 << 16)) == (0x3 << 16))
142 goto latch_out;
143
144 udelay(1);
145 }
146 if (timeout <= 0) {
147 printf("usbphy rterm cal failed\n");
148 if (!rc_restared) {
149 regval = readl(apbs_base + APB_SPARE_REG24);
150 regval &= ~0x1;
151 writel(regval, apbs_base + APB_SPARE_REG24);
152
153 regval = readl(apbs_base + APB_SPARE_REG24);
154 regval |= 0x1;
155 writel(regval, apbs_base + APB_SPARE_REG24);
156 udelay(100);
157 printf("apbs-reg24: 0x%x\n", readl(apbs_base + APB_SPARE_REG24));
158 rc_restared = true;
159 goto do_reterm_cal;
160 } else {
161 BUG();
162 }
163 }
164
165latch_out:
166 /* latch rterm value */
167 writel((0x1 << 20), base + PUPHY_REG11);
168 printf("PUPHY21: 0x%x PUPHY11: 0x%x\n",
169 readl(base + PUPHY_REG21), readl(base + PUPHY_REG11));
170}
171
172static void asr190x_rterm_calibration(u32 base)
173{
174 if (cpu_is_asr1901())
175 asr1901_a0_rterm_cal_porta(base);
176 else
177 asr1906_rterm_cal_porta(base);
178}
179
180static void usb31_phy_init(u32 base)
181{
182 u32 val;
183 u32 pll_wait_us = 400;
184
185 /*
186 * CONFIG PLL, default puphy clk is 100M clk for pcie
187 * should be config to usb 38.4M
188 */
189 val = readl(base + PUPHY_REG16);
190 val &= 0xFFFF0FFF;
191 val |= (0x6 << 13); /* 38.4M */
192 writel(val, base + PUPHY_REG16);
193
194 val = readl(base + PUPHY_REG17);
195 val &= (~(0x1 << 21));
196 writel(val, base + PUPHY_REG17);
197
198 val = readl(base + PUPHY_REG03);
199 val |= (0x3 << 8);
200 writel(val, base + PUPHY_REG03);
201
202 if (cpu_is_asr1901())
203 val = 0x18B;
204 else
205 val = 0x18C;
206 writel(val, base + PUPHY_REG1B);
207
208 writel(0x8014, base + PUPHY_REG07);
209#if 0
210 val = readl(base + PUPHY_REG07);
211 val &= ~(0x3ff<<2);
212 val |= ((512 & 0x3ff) << 2);
213 writel(val, base + PUPHY_REG07);
214#endif
215
216 val = readl(base + PUPHY_REG03);
217 val |= (0x1 << 2);
218 writel(val, base + PUPHY_REG03);
219
220 val = 0x97dfdf30;
221 writel(val, base + PUPHY_REG18);
222
223 val = readl(base + PUPHY_REG19);
224 val &= ~(0x1 << 5 | 0x1 << 6);
225 writel(val, base + PUPHY_REG19);
226
227
228 /* USB PHY config
229 * step.1
230 * config phphy, sw init done, ref clk cfg=2
231 * open allclk en bits
232 */
233 writel(0xB7C, base + PUPHY_REG02);
234
235 /* step.2 wait for PUPHY PLL READY */
236 while((readl(base + PUPHY_REG02) & 0x1) != 0x1)
237 {
238 udelay(1);
239 pll_wait_us--;
240 if (pll_wait_us == 0)
241 break;
242 }
243
244 /* step.3 override pipe_phystatus to 0 if puphy pll not ready */
245 if (pll_wait_us == 0) {
246 dwc3_force_usb2_mode();
247 writel((readl(base + PUPHY_REG10) | (0x1 << 10)), base + PUPHY_REG10);
248 }
249
250 /* settings for u1/u2/u3 */
251 if (!cpu_is_asr1901_z1()) {
252 val = readl(base + PUPHY_REG15);
253 val &= ~(0xF << 16);
254 val |= (0x3 << 16); /* */
255 writel(val, base + PUPHY_REG15);
256
257 val = readl(base + PUPHY_REG07);
258 val &= ~(0x3ff << 2);
259 val |= (200 << 2); /* */
260 writel(val, base + PUPHY_REG07);
261
262 if (cpu_is_asr1901_z2()) {
263 val = readl(base + PUPHY_REG2D);
264 val &= ~(0x7 << 22);
265 val |= (0X7 << 22); /* tx swing */
266 writel(val, base + PUPHY_REG2D);
267 } else if (cpu_is_asr1901_a0_plus()) {
268 val = readl(base + PUPHY_REG2D);
269 val &= ~(0x1ff << 16);
270 val |= (0X1C0 << 16); /* old rxeq value */
271 writel(val, base + PUPHY_REG2D);
272 } else if (cpu_is_asr1906()) {
273 val = readl(base + PUPHY_REG2D);
274 val &= ~(0x1ff << 16);
275 val |= (0X1f6 << 16); /* rxeq */
276 writel(val, base + PUPHY_REG2D);
277 } else {
278 val = readl(base + PUPHY_REG2D);
279 val &= ~(0x1ff << 16);
280 val |= (0X1f6 << 16); /* rxeq */
281 writel(val, base + PUPHY_REG2D);
282 }
283 }
284 /* Write 1s to clear phy err status */
285 writel(0xFFFFFFFF, base + PUPHY_REG04);
286
287 /* step.4 wait for USB2 PHY PLL READY */
288 pll_wait_us = 400;
289 while (((readl(base + USB2_PHY0_REG01) & USB2_PLL_BIT_RDY) != USB2_PLL_BIT_RDY)
290 && (pll_wait_us--))
291 {
292 udelay(1);
293 }
294
295 /*
296 * Step 5&6
297 * Release usb2 phy internal reset and enable clock gating
298 */
299 writel(0x60ef, base + USB2_PHY0_REG01);
300 writel(0x1C, base + USB2_PHY0_REG0D);
301
302 /* STEP.7
303 * 0x1: serial mode, 0x0: parallel mode
304 * USB2_PHY0_REG06 (USB2_BASE+0x18)
305 *
306 * serial mode
307 * writel((readl(base + USB2_PHY0_REG06) | 0x1), base + USB2_PHY0_REG06);
308 * parallel mode
309 */
310 writel((readl(base + USB2_PHY0_REG06) & (~0x1)), base + USB2_PHY0_REG06);
311
312 /* Write 1s to clear phy err status */
313 writel(0xFFFFFFFF, base + USB2_PHY0_REG0E);
314
315 asr190x_rterm_calibration(base);
316}
317
318#endif
319static int asr_usb3_phy_init(u32 base)
320{
321 u32 pll_wait_us = 400;
322
323#ifdef CONFIG_ASR1901
324 usb31_phy_init(base);
325 return;
326#endif
327
328 /*
329 * step.0 clear drv_pulldown_override_en
330 */
331 writel(readl(base + USB2_PHY0_REG29) & (~PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN), base + USB2_PHY0_REG29);
332
333 if (cpu_is_asr1903())
334 goto usb2_phy_init;
335
336 /* USB PHY config
337 * step.1
338 * config phphy, sw init done, ref clk cfg=2
339 * open allclk en bits
340 */
341 writel(0x97C, base + PUPHY_REG02);
342
343 /* step.2 wait for PUPHY PLL READY */
344 while((readl(base + PUPHY_REG02) & 0x1) != 0x1)
345 {
346 udelay(1);
347 pll_wait_us--;
348 if (pll_wait_us == 0)
349 break;
350 }
351
352 /* step.3 override pipe_phystatus to 0 if puphy pll not ready */
353 if (pll_wait_us == 0) {
354 dwc3_force_usb2_mode();
355 writel((readl(base + PUPHY_REG10) | (0x1 << 10)), base + PUPHY_REG10);
356 }
357
358usb2_phy_init:
359 /* step.4 wait for USB2 PHY PLL READY */
360 pll_wait_us = 400;
361 while (((readl(base + USB2_PHY0_REG01) & USB2_PLL_BIT_RDY) != USB2_PLL_BIT_RDY)
362 && (pll_wait_us--))
363 {
364 udelay(1);
365 }
366
367 /*
368 * Step 5&6
369 * Release usb2 phy internal reset and enable clock gating
370 */
371 writel(0x60ef, base + USB2_PHY0_REG01);
372 writel(0x1C, base + USB2_PHY0_REG0D);
373
374 /*
375 * STEP.7
376 * 0x1: serial mode, 0x0: parallel mode
377 * USB2_PHY0_REG06 (USB2_BASE+0x18)
378 *
379 * serial mode
380 * writel((readl(base + USB2_PHY0_REG06) | 0x1), base + USB2_PHY0_REG06);
381 * parallel mode
382 *
383 * set to serial mode for stability
384 */
385 writel(readl(base + USB2_PHY0_REG06) | (0x1), base + USB2_PHY0_REG06);
386
387 printf("usb phy inited!\n");
388 return 0;
389}
390static const char *charger_type(unsigned int type)
391{
392 switch (type) {
393 case NULL_CHARGER: return "NULL_CHARGER";
394 case DEFAULT_CHARGER: return "DEFAULT_CHARGER";
395 case DCP_CHARGER: return "DCP_CHARGER";
396 case CDP_CHARGER: return "CDP_CHARGER";
397 case SDP_CHARGER: return "SDP_CHARGER";
398 default: return "NONE_STANDARD_CHARGER";
399 }
400}
401
402static int _mv_usb2_phy_28nmhp_charger_detect(u32 base)
403{
404 int charger_type_bc12 = NULL_CHARGER;
405 u32 reg32;
406
407 reg32 = readl(base + PHY_28NMHP_PHY_REG25);
408 reg32 &= ~(PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_MASK);
409 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_VAL;
410 writel(reg32, base + PHY_28NMHP_PHY_REG25);
411
412 reg32 = readl(base + PHY_28NMHP_PHY_REG25);
413 reg32 &= ~PHY_28NMHP_DCP_DET_PULL_MASK;
414 reg32 |= PHY_28NMHP_DCP_DET_PULL_UP_DOWN;
415 writel(reg32, base + PHY_28NMHP_PHY_REG25);
416
417 reg32 = readl(base + PHY_28NMHP_PHY_REG29);
418 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
419 writel(reg32, base + PHY_28NMHP_PHY_REG29);
420
421 udelay(10);
422 reg32 = readl(base + PHY_28NMHP_PHY_REG04);
423 reg32 &= ~(0xff << 8);
424 reg32 |= (0x12 << 8);
425 writel(reg32, base + PHY_28NMHP_PHY_REG04);
426
427 if (cpu_is_asr1903()) {
428 if ((readl(APMU_SD_ROT_WAKE_CLR) & (0x3 << 26)) == (0x1 << 26))
429 charger_type_bc12 = NONE_STANDARD_CHARGER;
430 else
431 charger_type_bc12 = DCP_CHARGER;
432#ifdef CONFIG_ASR1901
433 } else if (cpu_is_asr1901() || cpu_is_asr1906()) {
434 if ((readl(ASR190X_APMU_LINE_STAT) & (0x3 << 0)) == (0x1 << 0))
435 charger_type_bc12 = NONE_STANDARD_CHARGER;
436 else
437 charger_type_bc12 = DCP_CHARGER;
438#endif
439 } else {
440 if ((readl(CONFIG_USB_REG_BASE + DWC3_LOCAL_REG_OFFSET + DWC3_USB2_DEBUG_REG)
441 & (0x3 << 8)) == (0x1 << 8))
442 charger_type_bc12 = NONE_STANDARD_CHARGER;
443 else
444 charger_type_bc12 = DCP_CHARGER;
445 }
446
447 reg32 = readl(base + PHY_28NMHP_PHY_REG29);
448 reg32 &= ~PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
449 writel(reg32, base + PHY_28NMHP_PHY_REG29);
450
451 return charger_type_bc12;
452}
453
454static int has_rst_event(u32 *buff, int size)
455{
456 int i;
457
458 for (i = 0; i < size; i++) {
459 if (buff[i] == 0x101)
460 return 1;
461 }
462 return 0;
463}
464static int dwc3_controller_stop(u32 base)
465{
466 u32 regval;
467
468 regval = 0x0;
469 writel(regval, base + DWC3_DEVTEN);
470
471 writel(readl(base + DWC3_GEVNTCOUNT(0)), DWC3_GEVNTCOUNT(0));
472 regval = readl(base + DWC3_DCTL);
473 regval &= (~DWC3_DCTL_RUN_STOP);
474 writel(regval, base + DWC3_DCTL);
475
476 writel(readl(base + DWC3_GEVNTCOUNT(0)), DWC3_GEVNTCOUNT(0));
477 regval = readl(base + DWC3_DCTL);
478 regval &= (~DWC3_DCTL_RUN_STOP);
479 writel(regval, base + DWC3_DCTL);
480 udelay(50);
481
482 return 0;
483}
484
485static int dwc3_sdp_charger_init(u32 base, int *charger_type)
486{
487 u32 regval, event_count, level;
488 u32 timeout;
489 static u32 event_buff = 0;
490
491 if (event_buff == 0) {
492 event_buff = memalign(64, EVENT_BUFF_SIZE);
493 if (!event_buff) {
494 printf("%s: malloc failure\n", __func__);
495 return 0;
496 }
497 }
498 memset(event_buff, 0x00, EVENT_BUFF_SIZE);
499 flush_dcache_range(event_buff, event_buff + EVENT_BUFF_SIZE);
500
501 /* SOFT RESET CONTROLLER */
502 regval = readl(base + DWC3_DCTL);
503 regval |= DWC3_DCTL_CSFTRST;
504 writel(regval, base + DWC3_DCTL);
505 /* worst case: delay 200ms to align with code in linux */
506 timeout = 50000;
507 do {
508 regval = readl(base + DWC3_DCTL);
509 if (!(regval & DWC3_DCTL_CSFTRST))
510 break;
511 udelay(4);
512 } while (--timeout);
513 /* make sure 3 phy clk delay before accessing phy */
514 udelay(5);
515
516 /* disable dpdm pull down */
517 asr_usbphy_dpdm_pulldown(CONFIG_USB_PHY_BASE, 0);
518
519 /* use mac2_clk as mac3_clk */
520 regval = readl(base + DWC3_GUCTL1);
521 regval |= (0x1 << 26);
522 writel(regval, base + DWC3_GUCTL1);
523
524 regval = 0x40002407;
525 writel(regval, base + DWC3_GUSB2PHYCFG(0));
526
527 /* dwc3_core_setup_global_control */
528 /* BIT[13:12]-10: SET AS DEVICE MODE */
529 regval = (1625<<19)|(0x2204);
530 writel(regval, base + DWC3_GCTL);
531
532 regval = 0x480800; /* HS mode */
533 writel(regval, base + DWC3_DCFG);
534
535 writel(event_buff, base + DWC3_GEVNTADRLO(0));
536 writel(0x0, base + DWC3_GEVNTADRHI(0));
537 writel(EVENT_BUFF_SIZE, base + DWC3_GEVNTSIZ(0));
538 writel(0x0, base + DWC3_GEVNTCOUNT(0));
539 printf("event buffer: 0x%x\n\r", event_buff);
540
541 regval = readl(base + DWC3_DEVTEN);
542 regval |= 0x1f;
543 writel(regval, base + DWC3_DEVTEN);
544
545 regval = readl(base + DWC3_DCTL);
546 regval |= DWC3_DCTL_RUN_STOP;
547 writel(regval, base + DWC3_DCTL);
548
549 timeout = 800 / 10; /* leave sometime for dcp charger handling */
550 while(timeout--) {
551 dwc3_charger_get_vbus(&level);
552 if (level == 0) {
553 printf("usb plugout\r\n");
554 *charger_type = NULL_CHARGER;
555 dwc3_controller_stop(base);
556 return 0;
557 }
558 mdelay(10);
559 regval = readl(base + DWC3_DSTS);
560 debug("DWC3_DSTS: 0x%x\n", regval);
561 regval = regval & DWC3_DSTS_CONNECTSPD;
562
563 event_count = readl(base + DWC3_GEVNTCOUNT(0)) & DWC3_GEVNTCOUNT_MASK;
564 debug("DWC3_GEVNTCOUNT(0): 0x%x\n", event_count);
565 if (regval == DWC3_DSTS_HIGHSPEED) {
566 *charger_type = SDP_CHARGER;
567 dwc3_controller_stop(base);
568 return 0;
569 }
570
571 if (event_count >= 0x10) {
572 invalidate_dcache_range(event_buff, event_buff + EVENT_BUFF_SIZE);
573 if (has_rst_event((u32 *)event_buff, (event_count >> 2))) {
574 *charger_type = SDP_CHARGER;
575 dwc3_controller_stop(base);
576 return 0;
577 }
578 }
579 }
580 /* quick charger */
581 if (event_count >= 0xc) {
582 *charger_type = DCP_CHARGER;
583 dwc3_controller_stop(base);
584 return 0;
585 }
586
587 dwc3_controller_stop(base);
588 return -EIO;
589}
590
591int get_usb_charger_type(void)
592{
593 unsigned int level = 0;
594 static int usb_charger_type = NULL_CHARGER;
595 u32 regval, base = CONFIG_USB_REG_BASE;
596 static bool usb_phy_inited = false;
597
598 dwc3_charger_get_vbus(&level);
599 if (level == 0) {
600 printf("usb_charger_type is NULL_CHARGER\n");
601 usb_charger_type = NULL_CHARGER;
602 goto out;
603 }
604
605 if (usb_charger_type != NULL_CHARGER) {
606 printf("noplugout: ");
607 goto out;
608 }
609
610 if (!usb_phy_inited) {
611 regval = readl(base + DWC3_GUSB3PIPECTL(0));
612 regval &= ~DWC3_GUSB3PIPECTL_SUSPHY;
613 writel(regval, base + DWC3_GUSB3PIPECTL(0));
614 asr_usb3_phy_init(CONFIG_USB_PHY_BASE);
615 usb_phy_inited = true;
616 }
617
618 if (!dwc3_sdp_charger_init(CONFIG_USB_REG_BASE, &usb_charger_type)) {
619 goto out;
620 } else {
621 usb_charger_type = _mv_usb2_phy_28nmhp_charger_detect(
622 CONFIG_USB_PHY_BASE);
623 }
624
625out:
626 /* enable dpdm pull down */
627 asr_usbphy_dpdm_pulldown(CONFIG_USB_PHY_BASE, 1);
628 printf("charger: %s\r\n",
629 charger_type(usb_charger_type));
630 return usb_charger_type;
631}
632
633int usb_vbus_is_online(void)
634{
635 u32 level = 0;
636
637 dwc3_charger_get_vbus(&level);
638 return level;
639}
640#endif
641
642#ifdef CONFIG_MRVL_USB_PHY_28HP
643#define APMU_SD_ROT_WAKE_CLR (0xd4282800 + 0x7c)
644#define APMU_USB_CLK_RES_CTRL (0xd4282800 + 0x5c)
645
646#define DWC2_USB_REG_BASE CONFIG_USB_REG_BASE
647#define DWC2_USB_GOTGCTL (DWC2_USB_REG_BASE + 0x0000)
648#define DWC2_USB_GOTGINT (DWC2_USB_REG_BASE + 0x0004)
649#define DWC2_USB_GAHBCFG (DWC2_USB_REG_BASE + 0x0008)
650#define DWC2_USB_GUSBCFG (DWC2_USB_REG_BASE + 0x000c)
651#define DWC2_USB_GRSTCTL (DWC2_USB_REG_BASE + 0x0010)
652#define DWC2_USB_GINTSTS (DWC2_USB_REG_BASE + 0x0014)
653#define DWC2_USB_GINTMSK (DWC2_USB_REG_BASE + 0x0018)
654#define DWC2_USB_GRXSTSR (DWC2_USB_REG_BASE + 0x001c)
655#define DWC2_USB_GRXSTSP (DWC2_USB_REG_BASE + 0x0020)
656#define DWC2_USB_GRXFSIZ (DWC2_USB_REG_BASE + 0x0024)
657#define DWC2_USB_GNPTXFSIZ (DWC2_USB_REG_BASE + 0x0028)
658#define DWC2_USB_GNPTXSTS (DWC2_USB_REG_BASE + 0x002c)
659#define DWC2_USB_GI2CCTL (DWC2_USB_REG_BASE + 0x0030)
660#define DWC2_USB_GPVNDCTL (DWC2_USB_REG_BASE + 0x0034)
661#define DWC2_USB_GGPIO (DWC2_USB_REG_BASE + 0x0038)
662#define DWC2_USB_GUID (DWC2_USB_REG_BASE + 0x003c)
663#define DWC2_USB_GSNPSID (DWC2_USB_REG_BASE + 0x0040)
664#define DWC2_USB_GHWCFG1 (DWC2_USB_REG_BASE + 0x0044)
665#define DWC2_USB_GHWCFG2 (DWC2_USB_REG_BASE + 0x0048)
666#define DWC2_USB_GHWCFG3 (DWC2_USB_REG_BASE + 0x004c)
667#define DWC2_USB_GHWCFG4 (DWC2_USB_REG_BASE + 0x0050)
668#define DWC2_USB_GLPMCFG (DWC2_USB_REG_BASE + 0x0054)
669#define DWC2_USB_HPTXFSIZ (DWC2_USB_REG_BASE + 0x0100)
670#define DWC2_USB_DPTXFSIZ(n) (DWC2_USB_REG_BASE + 0x0104+(n-1)*0x04)
671#define DWC2_USB_DIEPTXF(n) (DWC2_USB_REG_BASE + 0x0104+(n-1)*0x04)
672#define DWC2_USB_DCFG (DWC2_USB_REG_BASE + 0x0800)
673#define DWC2_USB_DCTL (DWC2_USB_REG_BASE + 0x0804)
674#define DWC2_USB_DSTS (DWC2_USB_REG_BASE + 0x0808)
675#define DWC2_USB_DIEPMSK (DWC2_USB_REG_BASE + 0x0810)
676#define DWC2_USB_DOEPMSK (DWC2_USB_REG_BASE + 0x0814)
677#define DWC2_USB_DAINT (DWC2_USB_REG_BASE + 0x0818)
678#define DWC2_USB_DAINTMSK (DWC2_USB_REG_BASE + 0x081c)
679
680__weak int charger_get_vbus(unsigned int *level)
681{
682 if (readl(APMU_SD_ROT_WAKE_CLR) & (0x1 << 15))
683 *level = 1;
684 else
685 *level = 0;
686
687 return 0;
688}
689
690static void dump_phy_regs(u32 base)
691{
692 int i;
693 u32 tmp32;
694 for (i = 0; i < 0x3f; i++) {
695 tmp32 = readl((uintptr_t)base + i * 4);
696 printf("[0x%x] = 0x%x\t", (base + i * 4), tmp32);
697 if (i % 5 == 0)
698 printf("\n");
699 }
700}
701
702static int asr_usb_phy_28nmhp_dpdm_pulldown(u32 base)
703{
704
705 u32 reg32;
706
707 reg32 = readl(base + PHY_28NMHP_PHY_REG25);
708 reg32 &= ~(PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_MASK);
709 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_VAL2;
710 writel(reg32, base + PHY_28NMHP_PHY_REG25);
711
712 if (cpu_is_asr1802s()) {
713 reg32 = readl(base + PHY_28NMHP_PHY_REG28);
714 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
715 writel(reg32, base + PHY_28NMHP_PHY_REG28);
716 } else {
717 /* pullup dp and pulldown dm */
718 reg32 = readl(base + PHY_28NMHP_PHY_REG29);
719 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
720 writel(reg32, base + PHY_28NMHP_PHY_REG29);
721 }
722 return 0;
723}
724
725static int mrvl_usb_phy_28nmhp_init(u32 base)
726{
727 unsigned int loops = 200;
728 unsigned int val;
729
730 /* WAIT FOR PHY PLL RDY */
731 while (((readl(base + PHY_28NMHP_PHY_REG01) & PHY_28NMHP_PLL_BIT_RDY) !=
732 PHY_28NMHP_PLL_BIT_RDY)
733 && (loops--))
734 udelay(1);
735 if (loops == 0)
736 printf("!!!!!!!!!!phy pll not ready after 200us\n");
737
738 /* Release usb2 phy internal reset and enable clock gating */
739 writel(0x60ef, base + PHY_28NMHP_PHY_REG01);
740 writel(0x1C, base + PHY_28NMHP_PHY_REG0D);
741 /*
742 * This is 1802s only
743 * 1803 has new reg -> threshold map table
744 * HS RX sequelch threshold: 4 -> 7 for yield rate
745 */
746 if (cpu_is_asr1802s()) {
747 writel(readl(base + PHY_28NMHP_PHY_REG28) & (~PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN), base + PHY_28NMHP_PHY_REG28);
748 writel(0x7468, base + PHY_28NMHP_PHY_REG23);
749 } else if (cpu_is_asr1803() || cpu_is_asr1806()) {
750 writel(readl(base + PHY_28NMHP_PHY_REG29) & (~PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN), base + PHY_28NMHP_PHY_REG29);
751 /* set to serial mode for stability */
752 writel(readl(base + PHY_28NMHP_PHY_REG06) | (0x1), base + PHY_28NMHP_PHY_REG06);
753
754 /* increase tx dac by 10%, will add back for some special cases */
755 /* writel((readl(base + PHY_28NMHP_PHY_REG29) & (~0x1F)) | (0x1B), base + PHY_28NMHP_PHY_REG29); */
756 }
757
758 val = readl(base + PHY_28NMHP_PHY_REG0A);
759 val &= ~(PHY_28NMHP_SUSPEND_PLL | PHY_28NMHP_SUSPEND_PHY);
760 writel(val, base + PHY_28NMHP_PHY_REG0A);
761
762 if (cpu_is_asr1806()) {
763 val = readl(APMU_USB_CLK_RES_CTRL);
764 val |= (0x1 << 2);
765 writel(val, APMU_USB_CLK_RES_CTRL);
766 }
767 printf("usb phy inited!\n");
768 return 0;
769}
770static const char *charger_type(unsigned int type)
771{
772 switch (type) {
773 case NULL_CHARGER: return "NULL_CHARGER";
774 case DEFAULT_CHARGER: return "DEFAULT_CHARGER";
775 case DCP_CHARGER: return "DCP_CHARGER";
776 case CDP_CHARGER: return "CDP_CHARGER";
777 case SDP_CHARGER: return "SDP_CHARGER";
778 default: return "NONE_STANDARD_CHARGER";
779 }
780}
781
782static int _mv_usb2_phy_28nmhp_charger_detect(u32 base)
783{
784 int charger_type_bc12 = NONE_STANDARD_CHARGER;
785 u32 reg32;
786
787 reg32 = readl(base + PHY_28NMHP_PHY_REG25);
788 reg32 &= ~(PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_MASK);
789 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_VAL;
790 writel(reg32, base + PHY_28NMHP_PHY_REG25);
791
792 if (cpu_is_asr1802s()) {
793 reg32 = readl(base + PHY_28NMHP_PHY_REG28);
794 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
795 writel(reg32, base + PHY_28NMHP_PHY_REG28);
796 } else {
797 /* pullup dp and pulldown dm */
798 reg32 = readl(base + PHY_28NMHP_PHY_REG25);
799 reg32 &= ~PHY_28NMHP_DCP_DET_PULL_MASK;
800 reg32 |= PHY_28NMHP_DCP_DET_PULL_UP_DOWN;
801 writel(reg32, base + PHY_28NMHP_PHY_REG25);
802
803 reg32 = readl(base + PHY_28NMHP_PHY_REG29);
804 reg32 |= PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
805 writel(reg32, base + PHY_28NMHP_PHY_REG29);
806 }
807
808 udelay(10);
809 if ((readl(CONFIG_USB_REG_BASE + 0x184) & (0x3 << 10)) == (0x2 << 10))
810 charger_type_bc12 = NONE_STANDARD_CHARGER;
811 else
812 charger_type_bc12 = DCP_CHARGER;
813
814 if (cpu_is_asr1802s()) {
815 reg32 = readl(base + PHY_28NMHP_PHY_REG28);
816 reg32 &= ~PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
817 writel(reg32, base + PHY_28NMHP_PHY_REG28);
818 } else {
819 reg32 = readl(base + PHY_28NMHP_PHY_REG29);
820 reg32 &= ~PHY_28NMHP_DRV_PULLDOWN_OVERRIDE_EN;
821 writel(reg32, base + PHY_28NMHP_PHY_REG29);
822 }
823
824 return charger_type_bc12;
825}
826
827static inline dwc2_writel(u32 reg, u32 value)
828{
829 writel(value, reg);
830}
831
832static int dwc2_get_charger_type(void)
833{
834 static int asr18xx_usb_charger_type = NULL_CHARGER;
835 int timeout = 8000;
836 u32 value;
837
838 timeout = 0;
839 do {
840 value = readl(DWC2_USB_GRSTCTL);
841 if (++timeout > 100000) {
842 printf("DWC2_USB_GRSTCTL timeout\n");
843 break;
844 }
845 udelay(1); /* 1us */
846 } while ((value & (0x1 << 31)) == 0);
847
848 timeout = 0;
849 dwc2_writel(DWC2_USB_GRSTCTL, 0x80000001);
850 do {
851 value = readl(DWC2_USB_GRSTCTL);
852 if (++timeout > 100000) {
853 printf("DWC2_USB_GRSTCTL RST timeout\n");
854 break;
855 }
856 udelay(1); /* 1us */
857 } while (value & 0x1);
858
859 dwc2_writel(DWC2_USB_GUSBCFG, 0x40001400);
860 dwc2_writel(DWC2_USB_GOTGCTL, 0x900c0);
861 dwc2_writel(DWC2_USB_GAHBCFG, 0x27);
862 dwc2_writel(DWC2_USB_GUSBCFG, 0x40002400);
863 dwc2_writel(DWC2_USB_DCFG, 0x8100000);
864 dwc2_writel(DWC2_USB_GRXFSIZ, 0x200);
865 dwc2_writel(DWC2_USB_GNPTXFSIZ, 0x200200);
866 dwc2_writel(DWC2_USB_DPTXFSIZ(1), 0x2000220);
867 dwc2_writel(DWC2_USB_DPTXFSIZ(2), 0x2000420);
868 dwc2_writel(DWC2_USB_DPTXFSIZ(3), 0x2000620);
869 dwc2_writel(DWC2_USB_DPTXFSIZ(4), 0x2000820);
870 dwc2_writel(DWC2_USB_DPTXFSIZ(5), 0x2000a20);
871 dwc2_writel(DWC2_USB_DPTXFSIZ(6), 0x2000c20);
872 dwc2_writel(DWC2_USB_DPTXFSIZ(7), 0x1000e20);
873 dwc2_writel(DWC2_USB_DPTXFSIZ(8), 0x1000f20);
874 dwc2_writel(DWC2_USB_DPTXFSIZ(9), 0x1001020);
875 dwc2_writel(DWC2_USB_DPTXFSIZ(10), 0x1001120);
876 dwc2_writel(DWC2_USB_DPTXFSIZ(11), 0x1001220);
877 dwc2_writel(DWC2_USB_DPTXFSIZ(12), 0x1001320);
878 dwc2_writel(DWC2_USB_DPTXFSIZ(13), 0x1001420);
879 dwc2_writel(DWC2_USB_DPTXFSIZ(14), 0x1001520);
880 dwc2_writel(DWC2_USB_DPTXFSIZ(15), 0x1001620);
881 dwc2_writel(DWC2_USB_GINTMSK, 0x0);
882 dwc2_writel(DWC2_USB_GINTSTS, 0xffffffff);
883 dwc2_writel(DWC2_USB_GINTMSK, 0xc3000);
884 dwc2_writel(DWC2_USB_DCTL, 0x0);
885
886 timeout = 9000;
887 while(timeout --) {
888 if (readl(DWC2_USB_GINTSTS) & (0x3 << 10)) {
889 asr18xx_usb_charger_type = SDP_CHARGER;
890 printf("gintsts: 0x%x\n", readl(DWC2_USB_GINTSTS));
891 goto out;
892 }
893
894 udelay(100);
895 }
896 asr18xx_usb_charger_type = DCP_CHARGER;
897
898out:
899 dwc2_writel(DWC2_USB_DCTL, 0x2);
900 asr_usb_phy_28nmhp_dpdm_pulldown(CONFIG_USB_PHY_BASE);
901 printf("usb_charger_type is %s\r\n",
902 charger_type(asr18xx_usb_charger_type));
903 return asr18xx_usb_charger_type;
904}
905
906int get_usb_charger_type(void)
907{
908 unsigned int level = 0;
909 static int asr18xx_usb_charger_type = NULL_CHARGER;
910 int timeout = 8000;
911
912 charger_get_vbus(&level);
913 if (level == 0) {
914 printf("usb_charger_type is NULL_CHARGER\n");
915 return NULL_CHARGER;
916 }
917
918 if (asr18xx_usb_charger_type != NULL_CHARGER)
919 return asr18xx_usb_charger_type;
920
921 mrvl_usb_phy_28nmhp_init(CONFIG_USB_PHY_BASE);
922 if (cpu_is_asr1806())
923 return dwc2_get_charger_type();
924
925 writel(readl(CONFIG_USB_REG_BASE + 0x140) | (0x1 << 1),
926 CONFIG_USB_REG_BASE + 0x140);
927 udelay(200);
928
929 writel(readl(CONFIG_USB_REG_BASE + 0x144) | (0x1 << 6),
930 CONFIG_USB_REG_BASE + 0x144);
931 udelay(10);
932
933 writel((readl(CONFIG_USB_REG_BASE + 0x1A8) & (~0x3)) | 0x2,
934 CONFIG_USB_REG_BASE + 0x1A8);
935
936 writel(readl(CONFIG_USB_REG_BASE + 0x140) | (0x1 << 0),
937 CONFIG_USB_REG_BASE + 0x140);
938
939 while(timeout --) {
940 if (readl(CONFIG_USB_REG_BASE + 0x144) & (0x1 << 6)) {
941 asr18xx_usb_charger_type = SDP_CHARGER;
942 goto out;
943 }
944
945 udelay(100);
946 }
947
948 writel(readl(CONFIG_USB_REG_BASE + 0x140) & (~0x1),
949 CONFIG_USB_REG_BASE + 0x140);
950 asr18xx_usb_charger_type = _mv_usb2_phy_28nmhp_charger_detect(
951 CONFIG_USB_PHY_BASE);
952
953out:
954 writel(readl(CONFIG_USB_REG_BASE + 0x140) & (~0x1),
955 CONFIG_USB_REG_BASE + 0x140);
956 asr_usb_phy_28nmhp_dpdm_pulldown(CONFIG_USB_PHY_BASE);
957 printf("usb_charger_type is %s\r\n",
958 charger_type(asr18xx_usb_charger_type));
959 return asr18xx_usb_charger_type;
960}
961
962int usb_vbus_is_online(void)
963{
964 if (readl(APMU_SD_ROT_WAKE_CLR) & (0x1 << 15))
965 return 1;
966 else
967 return 0;
968}
969#endif
970
971#ifdef CONFIG_MRVL_USB_PHY_28LP
972#define APMU_SD_ROT_WAKE_CLR (0xd4282800 + 0x7c)
973__weak int charger_get_vbus(unsigned int *level)
974{
975 if (readl(APMU_SD_ROT_WAKE_CLR) & (0x1 << 15))
976 *level = 1;
977 else
978 *level = 0;
979
980 return 0;
981}
982
983static void dump_phy_regs(u32 base)
984{
985 int i;
986 u32 tmp32;
987 for (i = 0; i < 0x3f; i++) {
988 tmp32 = readl((uintptr_t)base + i * 4);
989 printf("[0x%x] = 0x%x\t", (base + i * 4), tmp32);
990 if (i % 5 == 0)
991 printf("\n");
992 }
993}
994
995static int wait_for_phy_ready(struct usb_file *file)
996{
997 u32 tmp, done_mask;
998 int count = 0;
999 /*
1000 * polling calibration done?
1001 * 0xd420_7018[31] = 0x1;
1002 * 0xd420_7008[31] = 0x1;
1003 * 0xd420_7008[23] = 0x1;
1004 */
1005
1006 /* IMP Calibrate */
1007 writel(readl(&file->cal_reg) |
1008 IMPCAL_START, &file->cal_reg);
1009 /* Wait For Calibrate PHY */
1010 udelay(400);
1011 /* Make sure PHY Calibration is ready */
1012 do {
1013 tmp = readl(&file->cal_reg);
1014 done_mask = IMPCAL_DONE_MASK;
1015 tmp &= done_mask;
1016 if (tmp == IMPCAL_DONE(1))
1017 break;
1018 udelay(1000);
1019 } while ((count++) && (count < 100));
1020 if (count >= 100)
1021 printf("USB PHY Calibrate not done after 100mS.");
1022 writel(readl(&file->cal_reg) &
1023 (~IMPCAL_START), &file->cal_reg);
1024
1025 /* PLL Calibrate */
1026 writel(readl(&file->cal_reg) |
1027 PLLCAL_START, &file->cal_reg);
1028 udelay(400);
1029 count = 0;
1030 do {
1031 tmp = readl(&file->cal_reg);
1032 done_mask = PLLCAL_DONE_MASK;
1033 tmp &= done_mask;
1034 if (tmp == PLLCAL_DONE(1))
1035 break;
1036 udelay(1000);
1037 } while ((count++) && (count < 100));
1038 if (count >= 100)
1039 printf("USB PHY Calibrate not done after 100mS.");
1040 writel(readl(&file->cal_reg) &
1041 (~PLLCAL_START), &file->cal_reg);
1042
1043 /* SQ Calibrate */
1044 writel(readl(&file->rx_reg1) |
1045 SQCAL_START, &file->rx_reg1);
1046 /* Wait For Calibrate PHY */
1047 udelay(400);
1048 /* Make sure PHY Calibration is ready */
1049 count = 0;
1050 do {
1051 tmp = readl(&file->rx_reg1);
1052 done_mask = SQCAL_DONE_MASK;
1053 tmp &= done_mask;
1054 if (tmp == SQCAL_DONE(1))
1055 break;
1056 udelay(1000);
1057 } while ((count++) && (count < 100));
1058 if (count >= 100)
1059 printf("USB PHY Calibrate not done after 100mS.");
1060 writel(readl(&file->rx_reg1) &
1061 (~SQCAL_START), &file->rx_reg1);
1062
1063 /*
1064 * phy is ready?
1065 * 0xd420_7000[31] = 0x1;
1066 */
1067 count = 100;
1068 while (((readl(&file->pll_reg0) & PLL_READY_MASK) == 0) && count--)
1069 udelay(1000);
1070 if (count <= 0) {
1071 printf("%s %d: wait for ready timeout, UTMI_PLL 0x%x\n",
1072 __func__, __LINE__, readl(&file->pll_reg1));
1073 return -1;
1074 }
1075 return 0;
1076}
1077
1078static int mrvl_usb_phy_28nm_init(u32 base)
1079{
1080 struct usb_file *file = (struct usb_file *)(uintptr_t)base;
1081 u32 tmp32;
1082 int ret;
1083
1084 /*
1085 * pll control 0:
1086 * 0xd420_7000[6:0] = 0xd, b'000_1101 ---> REFDIV
1087 * 0xd420_7000[24:16] = 0xf0, b'1111_0000 ---> FBDIV
1088 * 0xd420_7000[11:8] = 0x3, b'0011 ---> ICP
1089 * 0xd420_7000[29:28] = 0x1, b'01 ---> SEL_LPFR
1090 */
1091 tmp32 = readl(&file->pll_reg0);
1092 tmp32 &= ~(REFDIV_MASK | FB_DIV_MASK | ICP_MASK | SEL_LPFR_MASK);
1093 if (cpu_is_pxa1826())
1094 tmp32 |= REFDIV(0xd) | FB_DIV(0xf0) | SEL_LPFR(0x1);
1095 else
1096 tmp32 |= REFDIV(0xd) | FB_DIV(0xf0) | ICP(0x3) | SEL_LPFR(0x1);
1097 writel(tmp32, &file->pll_reg0);
1098 /*
1099 * pll control 1:
1100 * 0xd420_7004[1:0] = 0x3, b'11 ---> [PU_PLL_BY_REG:PU_PLL]
1101 */
1102 tmp32 = readl(&file->pll_reg1);
1103 tmp32 &= ~(PLL_PU_MASK | PU_BY_MASK);
1104 tmp32 |= PLL_PU(0x1) | PU_BY(0x1);
1105 writel(tmp32, &file->pll_reg1);
1106 /*
1107 * tx reg 0:
1108 * 0xd420_700c[22:20] = 0x3, b'11 ---> AMP
1109 */
1110 tmp32 = readl(&file->tx_reg0);
1111 tmp32 &= ~(AMP_MASK);
1112 tmp32 |= AMP(0x3);
1113 writel(tmp32, &file->tx_reg0);
1114 /*
1115 * rx reg 0:
1116 * 0xd420_7018[3:0] = 0xa, b'1010 ---> SQ_THRESH
1117 */
1118 tmp32 = readl(&file->rx_reg0);
1119 tmp32 &= ~(SQ_THRESH_MASK);
1120 tmp32 |= SQ_THRESH(0xa);
1121 writel(tmp32, &file->rx_reg0);
1122 /*
1123 * dig reg 0:
1124 * 0xd420_701c[31] = 0, b'0 ---> BITSTAFFING_ERROR
1125 * 0xd420_701c[30] = 0, b'0 ---> LOSS_OF_SYNC_ERROR
1126 * 0xd420_701c[18:16] = 0x7, b'111 ---> SQ_FILT
1127 * 0xd420_701c[14:12] = 0x4, b'100 ---> SQ_BLK
1128 * 0xd420_701c[1:0] = 0x2, b'10 ---> SYNC_NUM
1129 */
1130 tmp32 = readl(&file->dig_reg0);
1131 tmp32 &= ~(BITSTAFFING_ERR_MASK | SYNC_ERR_MASK | SQ_FILT_MASK | SQ_BLK_MASK | SYNC_NUM_MASK);
1132 tmp32 |= (SQ_FILT(0x0) | SQ_BLK(0x0) | SYNC_NUM(0x1));
1133 writel(tmp32, &file->dig_reg0);
1134
1135 /*
1136 * otg reg:
1137 * 0xd420_7034[5:4] = 0x1, b'01 ---> [OTG_CONTROL_BY_PIN:PU_OTG]
1138 */
1139 tmp32 = readl(&file->otg_reg);
1140 tmp32 &= ~(OTG_CTRL_BY_MASK | PU_OTG_MASK);
1141 tmp32 |= OTG_CTRL_BY(0x0) | PU_OTG(0x1);
1142 writel(tmp32, &file->otg_reg);
1143 /*
1144 * tx reg 0:
1145 * 0xd420_700c[25:24] = 0x3, b'11 ---> [PU_ANA:PU_BY_REG]
1146 */
1147 tmp32 = readl(&file->tx_reg0);
1148 tmp32 &= ~(ANA_PU_MASK | TX_PU_BY_MASK);
1149 tmp32 |= ANA_PU(0x1) | TX_PU_BY(0x1);
1150 writel(tmp32, &file->tx_reg0);
1151
1152 tmp32 = readl(MV_USB2_PHY_CTRL0);
1153 tmp32 &= ~(VBUS_VALID_MASK);
1154 tmp32 |= VBUS_VALID_CTRL(0x3);
1155 writel(tmp32, MV_USB2_PHY_CTRL0);
1156
1157 udelay(400);
1158 ret = wait_for_phy_ready(file);
1159 if (ret < 0) {
1160 printf("initialize usb phy failed, dump usb registers:\n");
1161 dump_phy_regs(base);
1162 }
1163
1164 printf("usb phy inited 0x%x!\n", readl(&file->usb_ctrl0));
1165 return 0;
1166}
1167static const char *charger_type(unsigned int type)
1168{
1169 switch (type) {
1170 case NULL_CHARGER: return "NULL_CHARGER";
1171 case DEFAULT_CHARGER: return "DEFAULT_CHARGER";
1172 case DCP_CHARGER: return "DCP_CHARGER";
1173 case CDP_CHARGER: return "CDP_CHARGER";
1174 case SDP_CHARGER: return "SDP_CHARGER";
1175 default: return "NONE_STANDARD_CHARGER";
1176 }
1177}
1178
1179
1180static int _mv_usb2_phy_28nm_charger_detect(u32 base)
1181{
1182 struct usb_file *file = (struct usb_file *)(uintptr_t)base;
1183 int charger_type_bc12 = NULL_CHARGER;
1184 u32 reg32;
1185
1186 /* Power up Analog */
1187 reg32 = readl(&file->tx_reg0);
1188 reg32 |= (1 << PHY_28NM_TX_PU_BY_REG_SHIFT |
1189 1 << PHY_28NM_TX_PU_ANA_SHIFT);
1190 writel(reg32, &file->tx_reg0);
1191
1192 /* Power up Charger Detector */
1193 reg32 = readl(&file->chrg_reg);
1194 reg32 |= (1 << PHY_28NM_CHGDTC_PU_CHRG_DTC_SHIFT_28);
1195 writel(reg32, &file->chrg_reg);
1196
1197 udelay(100);
1198
1199 /* Primary detection */
1200 reg32 = readl(&file->chrg_reg);
1201 reg32 &= ~(1 << PHY_28NM_CHGDTC_DP_DM_SWAP_SHIFT_28 |
1202 3 << PHY_28NM_CHGDTC_VSRC_CHARGE_SHIFT_28 |
1203 3 << PHY_28NM_CHGDTC_VDAT_CHARGE_SHIFT_28 |
1204 1 << PHY_28NM_CHGDTC_CDP_DM_AUTO_SWITCH_SHIFT_28 |
1205 1 << PHY_28NM_CHGDTC_DCP_EN_SHIFT_28 |
1206 1 << PHY_28NM_CHGDTC_CDP_EN_SHIFT_28);
1207 writel(reg32, &file->chrg_reg);
1208
1209 reg32 = readl(&file->chrg_reg);
1210 reg32 |= (1 << PHY_28NM_CHGDTC_VSRC_CHARGE_SHIFT_28 |
1211 1 << PHY_28NM_CHGDTC_VDAT_CHARGE_SHIFT_28 |
1212 1 << PHY_28NM_CHGDTC_PD_EN_SHIFT_28);
1213 writel(reg32, &file->chrg_reg);
1214
1215 /* Enable swtich DM/DP */
1216 reg32 = readl(&file->chrg_reg);
1217 reg32 |= (1 << PHY_28NM_CHGDTC_ENABLE_SWITCH_DM_SHIFT_28 |
1218 1 << PHY_28NM_CHGDTC_ENABLE_SWITCH_DP_SHIFT_28);
1219 writel(reg32, &file->chrg_reg);
1220
1221 if ((readl(&file->usb_ctrl1)) &
1222 (1 << PHY_28NM_CTRL1_CHRG_DTC_OUT_SHIFT_28)) {
1223 /* We have CHRG_DTC_OUT set.
1224 * Now proceed with Secondary Detection
1225 */
1226
1227 mdelay(10);
1228
1229 reg32 = readl(&file->chrg_reg);
1230 reg32 |= (1 << PHY_28NM_CHGDTC_DP_DM_SWAP_SHIFT_28);
1231 writel(reg32, &file->chrg_reg);
1232
1233 mdelay(10);
1234
1235 if ((readl(&file->usb_ctrl1)) &
1236 (1 << PHY_28NM_CTRL1_CHRG_DTC_OUT_SHIFT_28))
1237 charger_type_bc12 = DCP_CHARGER;
1238 else
1239 charger_type_bc12 = CDP_CHARGER;
1240 } else {
1241 charger_type_bc12 = SDP_CHARGER;
1242 }
1243
1244 /* Disable swtich DM/DP */
1245 reg32 = readl(&file->chrg_reg);
1246 reg32 &= ~(1<<PHY_28NM_CHGDTC_ENABLE_SWITCH_DM_SHIFT_28 |
1247 1 << PHY_28NM_CHGDTC_ENABLE_SWITCH_DP_SHIFT_28);
1248 writel(reg32, &file->chrg_reg);
1249
1250 /* Power down Charger Detector */
1251 reg32 = readl(&file->chrg_reg);
1252 reg32 &= ~(1 << PHY_28NM_CHGDTC_PU_CHRG_DTC_SHIFT_28);
1253 writel(reg32, &file->chrg_reg);
1254
1255 return charger_type_bc12;
1256}
1257
1258int get_usb_charger_type(void)
1259{
1260 unsigned int level = 0;
1261 int usb_charger_type = NULL_CHARGER;
1262
1263 charger_get_vbus(&level);
1264 if (level == 0) {
1265 printf("usb_charger_type is NULL_CHARGER\n");
1266 return NULL_CHARGER;
1267 }
1268 usb_charger_type = _mv_usb2_phy_28nm_charger_detect(
1269 CONFIG_USB_PHY_BASE);
1270 printf("usb_charger_type is %s\r\n",
1271 charger_type(usb_charger_type));
1272 return usb_charger_type;
1273}
1274
1275int usb_vbus_is_online(void)
1276{
1277 if (readl(APMU_SD_ROT_WAKE_CLR) & (0x1 << 15))
1278 return 1;
1279 else
1280 return 0;
1281}
1282#endif
1283
1284#ifdef CONFIG_MRVL_USB_PHY_40LP
1285static int mrvl_usb_phy_40nm_init(u32 base)
1286{
1287 u16 tmp16;
1288 u32 tmp32;
1289
1290 /* Program 0xd4207004[8:0]= 0xF0 */
1291 /* Program 0xd4207004[13:9]=0xD */
1292 writew((MV_USB2_PHY_PLL0_DEFAULT
1293 & (~MV_USB2_PHY_PLL0_FBDIV(~0))
1294 & (~MV_USB2_PHY_PLL0_REFDIV(~0)))
1295 | MV_USB2_PHY_PLL0_FBDIV(0xF0)
1296 | MV_USB2_PHY_PLL0_REFDIV(0xD), base + MV_USB2_PHY_PLL0);
1297
1298 /* Program 0xd4207008[11:8]=0x1 */
1299 /* Program 0xd4207008[14:13]=0x1 */
1300 writew((MV_USB2_PHY_PLL1_DEFAULT
1301 & (~MV_USB2_PHY_PLL1_ICP(~0))
1302 & (~MV_USB2_PHY_PLL1_PLL_CONTROL_BY_PIN))
1303 | MV_USB2_PHY_PLL1_ICP(0x1)
1304 | MV_USB2_PHY_PLL1_PU_PLL, base + MV_USB2_PHY_PLL1);
1305
1306 /* Program 0xd4207034[14]=0x1 */
1307 writew(MV_USB2_PHY_ANA1_DEFAULT
1308 | MV_USB2_PHY_ANA1_PU_ANA, base + MV_USB2_PHY_ANA1);
1309
1310 /* Program 0xd420705c[3]=0x1 */
1311 writew(MV_USB2_PHY_OTG_DEFAULT
1312 | MV_USB2_PHY_OTG_PU, base + MV_USB2_PHY_OTG);
1313
1314 /* Program 0xD4207104[1] = 0x1 */
1315 /* Program 0xD4207104[0] = 0x1 */
1316 tmp32 = readl(base + MV_USB2_PHY_CTRL);
1317 writel(tmp32 | MV_USB2_PHY_CTRL_PU_PLL
1318 | MV_USB2_PHY_CTRL_PU, base + MV_USB2_PHY_CTRL);
1319
1320 /* Wait for 200us */
1321 udelay(200);
1322
1323 /* Program 0xd4207008[2]=0x1 */
1324 tmp16 = readw(base + MV_USB2_PHY_PLL1);
1325 writew(tmp16
1326 | MV_USB2_PHY_PLL1_VCOCAL_START, base + MV_USB2_PHY_PLL1);
1327
1328 /* Wait for 400us */
1329 udelay(400);
1330
1331 /* Polling 0xd4207008[15]=0x1 */
1332 while ((readw(base + MV_USB2_PHY_PLL1)
1333 & MV_USB2_PHY_PLL1_PLL_READY) == 0)
1334 printf("polling usb phy\n");
1335
1336 /* Program 0xd4207010[13]=0x1 */
1337 writew(MV_USB2_PHY_TX0_DEFAULT
1338 | MV_USB2_PHY_TX0_RCAL_START, base + MV_USB2_PHY_TX0);
1339
1340 /* Wait for 40us */
1341 udelay(40);
1342
1343 /* Program 0xd4207010[13]=0x0 */
1344 tmp16 = readw(base + MV_USB2_PHY_TX0);
1345 writew(tmp16
1346 & (~MV_USB2_PHY_TX0_RCAL_START), base + MV_USB2_PHY_TX0);
1347
1348 /* Wait for 400us */
1349 udelay(400);
1350
1351 printf("usb phy inited %x!\n", readl(base + MV_USB2_PHY_CTRL));
1352
1353 return 0;
1354}
1355#endif
1356
1357int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
1358{
1359#ifdef CONFIG_MRVL_USB_PHY_28LP
1360 mrvl_usb_phy_28nm_init(CONFIG_USB_PHY_BASE);
1361#endif
1362
1363#ifdef CONFIG_MRVL_USB_PHY_28HP
1364 mrvl_usb_phy_28nmhp_init(CONFIG_USB_PHY_BASE);
1365#endif
1366
1367#ifdef CONFIG_MRVL_USB_PHY_40LP /* CONFIG_MRVL_USB_PHY_40LP */
1368 mrvl_usb_phy_40nm_init(CONFIG_USB_PHY_BASE);
1369#endif
1370
1371#ifdef CONFIG_ASR_USB3_PHY /* CONFIG_ASR_USB3_PHY */
1372 u32 regval;
1373
1374 regval = readl(CONFIG_USB_REG_BASE + DWC3_GUSB3PIPECTL(0));
1375 regval &= ~DWC3_GUSB3PIPECTL_SUSPHY;
1376 writel(regval, CONFIG_USB_REG_BASE + DWC3_GUSB3PIPECTL(0));
1377 asr_usb3_phy_init(CONFIG_USB_PHY_BASE);
1378#endif
1379
1380 return 0;
1381}