diff options
Diffstat (limited to 'arch/arm/plat-omap/usb.c')
-rw-r--r-- | arch/arm/plat-omap/usb.c | 131 |
1 files changed, 91 insertions, 40 deletions
diff --git a/arch/arm/plat-omap/usb.c b/arch/arm/plat-omap/usb.c index a619475c4b76..2699c16d4da0 100644 --- a/arch/arm/plat-omap/usb.c +++ b/arch/arm/plat-omap/usb.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/plat-omap/usb.c -- platform level USB initialization | 2 | * arch/arm/plat-omap/usb.c -- platform level USB initialization |
3 | * | 3 | * |
4 | * Copyright (C) 2004 Texas Instruments, Inc. | 4 | * Copyright (C) 2004 Texas Instruments, Inc. |
@@ -156,8 +156,12 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device) | |||
156 | 156 | ||
157 | if (nwires == 0) { | 157 | if (nwires == 0) { |
158 | if (cpu_class_is_omap1() && !cpu_is_omap15xx()) { | 158 | if (cpu_class_is_omap1() && !cpu_is_omap15xx()) { |
159 | u32 l; | ||
160 | |||
159 | /* pulldown D+/D- */ | 161 | /* pulldown D+/D- */ |
160 | USB_TRANSCEIVER_CTRL_REG &= ~(3 << 1); | 162 | l = omap_readl(USB_TRANSCEIVER_CTRL); |
163 | l &= ~(3 << 1); | ||
164 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
161 | } | 165 | } |
162 | return 0; | 166 | return 0; |
163 | } | 167 | } |
@@ -171,6 +175,8 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device) | |||
171 | 175 | ||
172 | /* internal transceiver (unavailable on 17xx, 24xx) */ | 176 | /* internal transceiver (unavailable on 17xx, 24xx) */ |
173 | if (!cpu_class_is_omap2() && nwires == 2) { | 177 | if (!cpu_class_is_omap2() && nwires == 2) { |
178 | u32 l; | ||
179 | |||
174 | // omap_cfg_reg(P9_USB_DP); | 180 | // omap_cfg_reg(P9_USB_DP); |
175 | // omap_cfg_reg(R8_USB_DM); | 181 | // omap_cfg_reg(R8_USB_DM); |
176 | 182 | ||
@@ -185,9 +191,11 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device) | |||
185 | * - OTG support on this port not yet written | 191 | * - OTG support on this port not yet written |
186 | */ | 192 | */ |
187 | 193 | ||
188 | USB_TRANSCEIVER_CTRL_REG &= ~(7 << 4); | 194 | l = omap_readl(USB_TRANSCEIVER_CTRL); |
195 | l &= ~(7 << 4); | ||
189 | if (!is_device) | 196 | if (!is_device) |
190 | USB_TRANSCEIVER_CTRL_REG |= (3 << 1); | 197 | l |= (3 << 1); |
198 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
191 | 199 | ||
192 | return 3 << 16; | 200 | return 3 << 16; |
193 | } | 201 | } |
@@ -217,8 +225,13 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device) | |||
217 | * with VBUS switching and overcurrent detection. | 225 | * with VBUS switching and overcurrent detection. |
218 | */ | 226 | */ |
219 | 227 | ||
220 | if (cpu_class_is_omap1() && nwires != 6) | 228 | if (cpu_class_is_omap1() && nwires != 6) { |
221 | USB_TRANSCEIVER_CTRL_REG &= ~CONF_USB2_UNI_R; | 229 | u32 l; |
230 | |||
231 | l = omap_readl(USB_TRANSCEIVER_CTRL); | ||
232 | l &= ~CONF_USB2_UNI_R; | ||
233 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
234 | } | ||
222 | 235 | ||
223 | switch (nwires) { | 236 | switch (nwires) { |
224 | case 3: | 237 | case 3: |
@@ -238,9 +251,13 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device) | |||
238 | omap_cfg_reg(K20_24XX_USB0_VM); | 251 | omap_cfg_reg(K20_24XX_USB0_VM); |
239 | omap2_usb_devconf_set(0, USB_UNIDIR); | 252 | omap2_usb_devconf_set(0, USB_UNIDIR); |
240 | } else { | 253 | } else { |
254 | u32 l; | ||
255 | |||
241 | omap_cfg_reg(AA9_USB0_VP); | 256 | omap_cfg_reg(AA9_USB0_VP); |
242 | omap_cfg_reg(R9_USB0_VM); | 257 | omap_cfg_reg(R9_USB0_VM); |
243 | USB_TRANSCEIVER_CTRL_REG |= CONF_USB2_UNI_R; | 258 | l = omap_readl(USB_TRANSCEIVER_CTRL); |
259 | l |= CONF_USB2_UNI_R; | ||
260 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
244 | } | 261 | } |
245 | break; | 262 | break; |
246 | default: | 263 | default: |
@@ -254,8 +271,13 @@ static u32 __init omap_usb1_init(unsigned nwires) | |||
254 | { | 271 | { |
255 | u32 syscon1 = 0; | 272 | u32 syscon1 = 0; |
256 | 273 | ||
257 | if (cpu_class_is_omap1() && !cpu_is_omap15xx() && nwires != 6) | 274 | if (cpu_class_is_omap1() && !cpu_is_omap15xx() && nwires != 6) { |
258 | USB_TRANSCEIVER_CTRL_REG &= ~CONF_USB1_UNI_R; | 275 | u32 l; |
276 | |||
277 | l = omap_readl(USB_TRANSCEIVER_CTRL); | ||
278 | l &= ~CONF_USB1_UNI_R; | ||
279 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
280 | } | ||
259 | if (cpu_is_omap24xx()) | 281 | if (cpu_is_omap24xx()) |
260 | omap2_usb_devconf_clear(1, USB_BIDIR_TLL); | 282 | omap2_usb_devconf_clear(1, USB_BIDIR_TLL); |
261 | 283 | ||
@@ -316,8 +338,13 @@ static u32 __init omap_usb1_init(unsigned nwires) | |||
316 | syscon1 = 3; | 338 | syscon1 = 3; |
317 | omap_cfg_reg(USB1_VP); | 339 | omap_cfg_reg(USB1_VP); |
318 | omap_cfg_reg(USB1_VM); | 340 | omap_cfg_reg(USB1_VM); |
319 | if (!cpu_is_omap15xx()) | 341 | if (!cpu_is_omap15xx()) { |
320 | USB_TRANSCEIVER_CTRL_REG |= CONF_USB1_UNI_R; | 342 | u32 l; |
343 | |||
344 | l = omap_readl(USB_TRANSCEIVER_CTRL); | ||
345 | l |= CONF_USB1_UNI_R; | ||
346 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
347 | } | ||
321 | break; | 348 | break; |
322 | default: | 349 | default: |
323 | bad: | 350 | bad: |
@@ -340,8 +367,13 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup) | |||
340 | if (alt_pingroup || nwires == 0) | 367 | if (alt_pingroup || nwires == 0) |
341 | return 0; | 368 | return 0; |
342 | 369 | ||
343 | if (cpu_class_is_omap1() && !cpu_is_omap15xx() && nwires != 6) | 370 | if (cpu_class_is_omap1() && !cpu_is_omap15xx() && nwires != 6) { |
344 | USB_TRANSCEIVER_CTRL_REG &= ~CONF_USB2_UNI_R; | 371 | u32 l; |
372 | |||
373 | l = omap_readl(USB_TRANSCEIVER_CTRL); | ||
374 | l &= ~CONF_USB2_UNI_R; | ||
375 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
376 | } | ||
345 | 377 | ||
346 | /* external transceiver */ | 378 | /* external transceiver */ |
347 | if (cpu_is_omap15xx()) { | 379 | if (cpu_is_omap15xx()) { |
@@ -410,9 +442,13 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup) | |||
410 | omap_cfg_reg(USB2_VP); | 442 | omap_cfg_reg(USB2_VP); |
411 | omap_cfg_reg(USB2_VM); | 443 | omap_cfg_reg(USB2_VM); |
412 | } else { | 444 | } else { |
445 | u32 l; | ||
446 | |||
413 | omap_cfg_reg(AA9_USB2_VP); | 447 | omap_cfg_reg(AA9_USB2_VP); |
414 | omap_cfg_reg(R9_USB2_VM); | 448 | omap_cfg_reg(R9_USB2_VM); |
415 | USB_TRANSCEIVER_CTRL_REG |= CONF_USB2_UNI_R; | 449 | l = omap_readl(USB_TRANSCEIVER_CTRL); |
450 | l |= CONF_USB2_UNI_R; | ||
451 | omap_writel(l, USB_TRANSCEIVER_CTRL); | ||
416 | } | 452 | } |
417 | break; | 453 | break; |
418 | default: | 454 | default: |
@@ -531,10 +567,6 @@ static struct platform_device otg_device = { | |||
531 | 567 | ||
532 | /*-------------------------------------------------------------------------*/ | 568 | /*-------------------------------------------------------------------------*/ |
533 | 569 | ||
534 | #define ULPD_CLOCK_CTRL_REG __REG16(ULPD_CLOCK_CTRL) | ||
535 | #define ULPD_SOFT_REQ_REG __REG16(ULPD_SOFT_REQ) | ||
536 | |||
537 | |||
538 | // FIXME correct answer depends on hmc_mode, | 570 | // FIXME correct answer depends on hmc_mode, |
539 | // as does (on omap1) any nonzero value for config->otg port number | 571 | // as does (on omap1) any nonzero value for config->otg port number |
540 | #ifdef CONFIG_USB_GADGET_OMAP | 572 | #ifdef CONFIG_USB_GADGET_OMAP |
@@ -550,17 +582,17 @@ static struct platform_device otg_device = { | |||
550 | void __init | 582 | void __init |
551 | omap_otg_init(struct omap_usb_config *config) | 583 | omap_otg_init(struct omap_usb_config *config) |
552 | { | 584 | { |
553 | u32 syscon = OTG_SYSCON_1_REG & 0xffff; | 585 | u32 syscon; |
554 | int status; | 586 | int status; |
555 | int alt_pingroup = 0; | 587 | int alt_pingroup = 0; |
556 | 588 | ||
557 | /* NOTE: no bus or clock setup (yet?) */ | 589 | /* NOTE: no bus or clock setup (yet?) */ |
558 | 590 | ||
559 | syscon = OTG_SYSCON_1_REG & 0xffff; | 591 | syscon = omap_readl(OTG_SYSCON_1) & 0xffff; |
560 | if (!(syscon & OTG_RESET_DONE)) | 592 | if (!(syscon & OTG_RESET_DONE)) |
561 | pr_debug("USB resets not complete?\n"); | 593 | pr_debug("USB resets not complete?\n"); |
562 | 594 | ||
563 | // OTG_IRQ_EN_REG = 0; | 595 | //omap_writew(0, OTG_IRQ_EN); |
564 | 596 | ||
565 | /* pin muxing and transceiver pinouts */ | 597 | /* pin muxing and transceiver pinouts */ |
566 | if (config->pins[0] > 2) /* alt pingroup 2 */ | 598 | if (config->pins[0] > 2) /* alt pingroup 2 */ |
@@ -568,8 +600,8 @@ omap_otg_init(struct omap_usb_config *config) | |||
568 | syscon |= omap_usb0_init(config->pins[0], is_usb0_device(config)); | 600 | syscon |= omap_usb0_init(config->pins[0], is_usb0_device(config)); |
569 | syscon |= omap_usb1_init(config->pins[1]); | 601 | syscon |= omap_usb1_init(config->pins[1]); |
570 | syscon |= omap_usb2_init(config->pins[2], alt_pingroup); | 602 | syscon |= omap_usb2_init(config->pins[2], alt_pingroup); |
571 | pr_debug("OTG_SYSCON_1_REG = %08x\n", syscon); | 603 | pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); |
572 | OTG_SYSCON_1_REG = syscon; | 604 | omap_writel(syscon, OTG_SYSCON_1); |
573 | 605 | ||
574 | syscon = config->hmc_mode; | 606 | syscon = config->hmc_mode; |
575 | syscon |= USBX_SYNCHRO | (4 << 16) /* B_ASE0_BRST */; | 607 | syscon |= USBX_SYNCHRO | (4 << 16) /* B_ASE0_BRST */; |
@@ -578,9 +610,10 @@ omap_otg_init(struct omap_usb_config *config) | |||
578 | syscon |= OTG_EN; | 610 | syscon |= OTG_EN; |
579 | #endif | 611 | #endif |
580 | if (cpu_class_is_omap1()) | 612 | if (cpu_class_is_omap1()) |
581 | pr_debug("USB_TRANSCEIVER_CTRL_REG = %03x\n", USB_TRANSCEIVER_CTRL_REG); | 613 | pr_debug("USB_TRANSCEIVER_CTRL = %03x\n", |
582 | pr_debug("OTG_SYSCON_2_REG = %08x\n", syscon); | 614 | omap_readl(USB_TRANSCEIVER_CTRL)); |
583 | OTG_SYSCON_2_REG = syscon; | 615 | pr_debug("OTG_SYSCON_2 = %08x\n", omap_readl(OTG_SYSCON_2)); |
616 | omap_writel(syscon, OTG_SYSCON_2); | ||
584 | 617 | ||
585 | printk("USB: hmc %d", config->hmc_mode); | 618 | printk("USB: hmc %d", config->hmc_mode); |
586 | if (!alt_pingroup) | 619 | if (!alt_pingroup) |
@@ -597,12 +630,19 @@ omap_otg_init(struct omap_usb_config *config) | |||
597 | printk("\n"); | 630 | printk("\n"); |
598 | 631 | ||
599 | if (cpu_class_is_omap1()) { | 632 | if (cpu_class_is_omap1()) { |
633 | u16 w; | ||
634 | |||
600 | /* leave USB clocks/controllers off until needed */ | 635 | /* leave USB clocks/controllers off until needed */ |
601 | ULPD_SOFT_REQ_REG &= ~SOFT_USB_CLK_REQ; | 636 | w = omap_readw(ULPD_SOFT_REQ); |
602 | ULPD_CLOCK_CTRL_REG &= ~USB_MCLK_EN; | 637 | w &= ~SOFT_USB_CLK_REQ; |
603 | ULPD_CLOCK_CTRL_REG |= DIS_USB_PVCI_CLK; | 638 | omap_writew(w, ULPD_SOFT_REQ); |
639 | |||
640 | w = omap_readw(ULPD_CLOCK_CTRL); | ||
641 | w &= ~USB_MCLK_EN; | ||
642 | w |= DIS_USB_PVCI_CLK; | ||
643 | omap_writew(w, ULPD_CLOCK_CTRL); | ||
604 | } | 644 | } |
605 | syscon = OTG_SYSCON_1_REG; | 645 | syscon = omap_readl(OTG_SYSCON_1); |
606 | syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN; | 646 | syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN; |
607 | 647 | ||
608 | #ifdef CONFIG_USB_GADGET_OMAP | 648 | #ifdef CONFIG_USB_GADGET_OMAP |
@@ -639,8 +679,8 @@ omap_otg_init(struct omap_usb_config *config) | |||
639 | pr_debug("can't register OTG device, %d\n", status); | 679 | pr_debug("can't register OTG device, %d\n", status); |
640 | } | 680 | } |
641 | #endif | 681 | #endif |
642 | pr_debug("OTG_SYSCON_1_REG = %08x\n", syscon); | 682 | pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1)); |
643 | OTG_SYSCON_1_REG = syscon; | 683 | omap_writel(syscon, OTG_SYSCON_1); |
644 | 684 | ||
645 | status = 0; | 685 | status = 0; |
646 | } | 686 | } |
@@ -653,18 +693,19 @@ static inline void omap_otg_init(struct omap_usb_config *config) {} | |||
653 | 693 | ||
654 | #ifdef CONFIG_ARCH_OMAP15XX | 694 | #ifdef CONFIG_ARCH_OMAP15XX |
655 | 695 | ||
656 | #define ULPD_DPLL_CTRL_REG __REG16(ULPD_DPLL_CTRL) | 696 | /* ULPD_DPLL_CTRL */ |
657 | #define DPLL_IOB (1 << 13) | 697 | #define DPLL_IOB (1 << 13) |
658 | #define DPLL_PLL_ENABLE (1 << 4) | 698 | #define DPLL_PLL_ENABLE (1 << 4) |
659 | #define DPLL_LOCK (1 << 0) | 699 | #define DPLL_LOCK (1 << 0) |
660 | 700 | ||
661 | #define ULPD_APLL_CTRL_REG __REG16(ULPD_APLL_CTRL) | 701 | /* ULPD_APLL_CTRL */ |
662 | #define APLL_NDPLL_SWITCH (1 << 0) | 702 | #define APLL_NDPLL_SWITCH (1 << 0) |
663 | 703 | ||
664 | 704 | ||
665 | static void __init omap_1510_usb_init(struct omap_usb_config *config) | 705 | static void __init omap_1510_usb_init(struct omap_usb_config *config) |
666 | { | 706 | { |
667 | unsigned int val; | 707 | unsigned int val; |
708 | u16 w; | ||
668 | 709 | ||
669 | omap_usb0_init(config->pins[0], is_usb0_device(config)); | 710 | omap_usb0_init(config->pins[0], is_usb0_device(config)); |
670 | omap_usb1_init(config->pins[1]); | 711 | omap_usb1_init(config->pins[1]); |
@@ -685,12 +726,22 @@ static void __init omap_1510_usb_init(struct omap_usb_config *config) | |||
685 | printk("\n"); | 726 | printk("\n"); |
686 | 727 | ||
687 | /* use DPLL for 48 MHz function clock */ | 728 | /* use DPLL for 48 MHz function clock */ |
688 | pr_debug("APLL %04x DPLL %04x REQ %04x\n", ULPD_APLL_CTRL_REG, | 729 | pr_debug("APLL %04x DPLL %04x REQ %04x\n", omap_readw(ULPD_APLL_CTRL), |
689 | ULPD_DPLL_CTRL_REG, ULPD_SOFT_REQ_REG); | 730 | omap_readw(ULPD_DPLL_CTRL), omap_readw(ULPD_SOFT_REQ)); |
690 | ULPD_APLL_CTRL_REG &= ~APLL_NDPLL_SWITCH; | 731 | |
691 | ULPD_DPLL_CTRL_REG |= DPLL_IOB | DPLL_PLL_ENABLE; | 732 | w = omap_readw(ULPD_APLL_CTRL); |
692 | ULPD_SOFT_REQ_REG |= SOFT_UDC_REQ | SOFT_DPLL_REQ; | 733 | w &= ~APLL_NDPLL_SWITCH; |
693 | while (!(ULPD_DPLL_CTRL_REG & DPLL_LOCK)) | 734 | omap_writew(w, ULPD_APLL_CTRL); |
735 | |||
736 | w = omap_readw(ULPD_DPLL_CTRL); | ||
737 | w |= DPLL_IOB | DPLL_PLL_ENABLE; | ||
738 | omap_writew(w, ULPD_DPLL_CTRL); | ||
739 | |||
740 | w = omap_readw(ULPD_SOFT_REQ); | ||
741 | w |= SOFT_UDC_REQ | SOFT_DPLL_REQ; | ||
742 | omap_writew(w, ULPD_SOFT_REQ); | ||
743 | |||
744 | while (!(omap_readw(ULPD_DPLL_CTRL) & DPLL_LOCK)) | ||
694 | cpu_relax(); | 745 | cpu_relax(); |
695 | 746 | ||
696 | #ifdef CONFIG_USB_GADGET_OMAP | 747 | #ifdef CONFIG_USB_GADGET_OMAP |