aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-omap2/usb-host.c195
-rw-r--r--arch/arm/plat-omap/include/plat/usb.h2
2 files changed, 183 insertions, 14 deletions
diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c
index b04ce6f8f013..ab0638208748 100644
--- a/arch/arm/mach-omap2/usb-host.c
+++ b/arch/arm/mach-omap2/usb-host.c
@@ -6,6 +6,7 @@
6 * 6 *
7 * Copyright (C) 2007-2011 Texas Instruments 7 * Copyright (C) 2007-2011 Texas Instruments
8 * Author: Vikram Pandita <vikram.pandita@ti.com> 8 * Author: Vikram Pandita <vikram.pandita@ti.com>
9 * Author: Keshava Munegowda <keshava_mgowda@ti.com>
9 * 10 *
10 * Generalization by: 11 * Generalization by:
11 * Felipe Balbi <balbi@ti.com> 12 * Felipe Balbi <balbi@ti.com>
@@ -19,7 +20,7 @@
19#include <linux/errno.h> 20#include <linux/errno.h>
20#include <linux/delay.h> 21#include <linux/delay.h>
21#include <linux/platform_device.h> 22#include <linux/platform_device.h>
22#include <linux/clk.h> 23#include <linux/slab.h>
23#include <linux/dma-mapping.h> 24#include <linux/dma-mapping.h>
24 25
25#include <asm/io.h> 26#include <asm/io.h>
@@ -30,7 +31,7 @@
30 31
31#include "mux.h" 32#include "mux.h"
32 33
33#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE) 34#ifdef CONFIG_MFD_OMAP_USB_HOST
34 35
35static struct resource ehci_resources[] = { 36static struct resource ehci_resources[] = {
36 { 37 {
@@ -361,17 +362,6 @@ void __init usb_ehci_init(const struct usbhs_omap_board_data *pdata)
361 } 362 }
362} 363}
363 364
364#else
365
366void __init usb_ehci_init(const struct usbhs_omap_board_data *pdata)
367
368{
369}
370
371#endif /* CONFIG_USB_EHCI_HCD */
372
373#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
374
375static struct resource ohci_resources[] = { 365static struct resource ohci_resources[] = {
376 { 366 {
377 .name = "ohci", 367 .name = "ohci",
@@ -508,6 +498,77 @@ static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
508 } 498 }
509} 499}
510 500
501static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
502{
503 switch (port_mode[0]) {
504 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
505 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
506 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
507 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
508 omap_mux_init_signal("usbb1_mm_rxdp",
509 OMAP_PIN_INPUT_PULLDOWN);
510 omap_mux_init_signal("usbb1_mm_rxdm",
511 OMAP_PIN_INPUT_PULLDOWN);
512
513 case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
514 case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
515 omap_mux_init_signal("usbb1_mm_rxrcv",
516 OMAP_PIN_INPUT_PULLDOWN);
517
518 case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
519 case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
520 omap_mux_init_signal("usbb1_mm_txen",
521 OMAP_PIN_INPUT_PULLDOWN);
522
523
524 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
525 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
526 omap_mux_init_signal("usbb1_mm_txdat",
527 OMAP_PIN_INPUT_PULLDOWN);
528 omap_mux_init_signal("usbb1_mm_txse0",
529 OMAP_PIN_INPUT_PULLDOWN);
530 break;
531
532 case OMAP_USBHS_PORT_MODE_UNUSED:
533 default:
534 break;
535 }
536
537 switch (port_mode[1]) {
538 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0:
539 case OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM:
540 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0:
541 case OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM:
542 omap_mux_init_signal("usbb2_mm_rxdp",
543 OMAP_PIN_INPUT_PULLDOWN);
544 omap_mux_init_signal("usbb2_mm_rxdm",
545 OMAP_PIN_INPUT_PULLDOWN);
546
547 case OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM:
548 case OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM:
549 omap_mux_init_signal("usbb2_mm_rxrcv",
550 OMAP_PIN_INPUT_PULLDOWN);
551
552 case OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0:
553 case OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0:
554 omap_mux_init_signal("usbb2_mm_txen",
555 OMAP_PIN_INPUT_PULLDOWN);
556
557
558 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0:
559 case OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM:
560 omap_mux_init_signal("usbb2_mm_txdat",
561 OMAP_PIN_INPUT_PULLDOWN);
562 omap_mux_init_signal("usbb2_mm_txse0",
563 OMAP_PIN_INPUT_PULLDOWN);
564 break;
565
566 case OMAP_USBHS_PORT_MODE_UNUSED:
567 default:
568 break;
569 }
570}
571
511void __init usb_ohci_init(const struct usbhs_omap_board_data *pdata) 572void __init usb_ohci_init(const struct usbhs_omap_board_data *pdata)
512{ 573{
513 platform_device_add_data(&ohci_device, pdata, sizeof(*pdata)); 574 platform_device_add_data(&ohci_device, pdata, sizeof(*pdata));
@@ -522,10 +583,116 @@ void __init usb_ohci_init(const struct usbhs_omap_board_data *pdata)
522 } 583 }
523} 584}
524 585
586#define OMAP_USBHS_DEVICE "usbhs-omap"
587
588static struct resource usbhs_resources[] = {
589 {
590 .name = "uhh",
591 .flags = IORESOURCE_MEM,
592 },
593 {
594 .name = "tll",
595 .flags = IORESOURCE_MEM,
596 },
597 {
598 .name = "ehci",
599 .flags = IORESOURCE_MEM,
600 },
601 {
602 .name = "ehci-irq",
603 .flags = IORESOURCE_IRQ,
604 },
605 {
606 .name = "ohci",
607 .flags = IORESOURCE_MEM,
608 },
609 {
610 .name = "ohci-irq",
611 .flags = IORESOURCE_IRQ,
612 }
613};
614
615static struct platform_device usbhs_device = {
616 .name = OMAP_USBHS_DEVICE,
617 .id = 0,
618 .num_resources = ARRAY_SIZE(usbhs_resources),
619 .resource = usbhs_resources,
620};
621
622static struct usbhs_omap_platform_data usbhs_data;
623static struct ehci_hcd_omap_platform_data ehci_data;
624static struct ohci_hcd_omap_platform_data ohci_data;
625
626void __init usbhs_init(const struct usbhs_omap_board_data *pdata)
627{
628 int i;
629
630 for (i = 0; i < OMAP3_HS_USB_PORTS; i++) {
631 usbhs_data.port_mode[i] = pdata->port_mode[i];
632 ohci_data.port_mode[i] = pdata->port_mode[i];
633 ehci_data.port_mode[i] = pdata->port_mode[i];
634 ehci_data.reset_gpio_port[i] = pdata->reset_gpio_port[i];
635 ehci_data.regulator[i] = pdata->regulator[i];
636 }
637 ehci_data.phy_reset = pdata->phy_reset;
638 ohci_data.es2_compatibility = pdata->es2_compatibility;
639 usbhs_data.ehci_data = &ehci_data;
640 usbhs_data.ohci_data = &ohci_data;
641
642 if (cpu_is_omap34xx()) {
643 usbhs_resources[0].start = OMAP34XX_UHH_CONFIG_BASE;
644 usbhs_resources[0].end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1;
645 usbhs_resources[1].start = OMAP34XX_USBTLL_BASE;
646 usbhs_resources[1].end = OMAP34XX_USBTLL_BASE + SZ_4K - 1;
647 usbhs_resources[2].start = OMAP34XX_EHCI_BASE;
648 usbhs_resources[2].end = OMAP34XX_EHCI_BASE + SZ_1K - 1;
649 usbhs_resources[3].start = INT_34XX_EHCI_IRQ;
650 usbhs_resources[4].start = OMAP34XX_OHCI_BASE;
651 usbhs_resources[4].end = OMAP34XX_OHCI_BASE + SZ_1K - 1;
652 usbhs_resources[5].start = INT_34XX_OHCI_IRQ;
653 setup_ehci_io_mux(pdata->port_mode);
654 setup_ohci_io_mux(pdata->port_mode);
655 } else if (cpu_is_omap44xx()) {
656 usbhs_resources[0].start = OMAP44XX_UHH_CONFIG_BASE;
657 usbhs_resources[0].end = OMAP44XX_UHH_CONFIG_BASE + SZ_1K - 1;
658 usbhs_resources[1].start = OMAP44XX_USBTLL_BASE;
659 usbhs_resources[1].end = OMAP44XX_USBTLL_BASE + SZ_4K - 1;
660 usbhs_resources[2].start = OMAP44XX_HSUSB_EHCI_BASE;
661 usbhs_resources[2].end = OMAP44XX_HSUSB_EHCI_BASE + SZ_1K - 1;
662 usbhs_resources[3].start = OMAP44XX_IRQ_EHCI;
663 usbhs_resources[4].start = OMAP44XX_HSUSB_OHCI_BASE;
664 usbhs_resources[4].end = OMAP44XX_HSUSB_OHCI_BASE + SZ_1K - 1;
665 usbhs_resources[5].start = OMAP44XX_IRQ_OHCI;
666 setup_4430ehci_io_mux(pdata->port_mode);
667 setup_4430ohci_io_mux(pdata->port_mode);
668 }
669
670 if (platform_device_add_data(&usbhs_device,
671 &usbhs_data, sizeof(usbhs_data)) < 0) {
672 printk(KERN_ERR "USBHS platform_device_add_data failed\n");
673 goto init_end;
674 }
675
676 if (platform_device_register(&usbhs_device) < 0)
677 printk(KERN_ERR "USBHS platform_device_register failed\n");
678
679init_end:
680 return;
681}
682
525#else 683#else
526 684
685void __init usbhs_init(const struct usbhs_omap_board_data *pdata)
686{
687}
688
527void __init usb_ohci_init(const struct usbhs_omap_board_data *pdata) 689void __init usb_ohci_init(const struct usbhs_omap_board_data *pdata)
528{ 690{
529} 691}
530 692
531#endif /* CONFIG_USB_OHCI_HCD */ 693void __init usb_ehci_init(const struct usbhs_omap_board_data *pdata)
694{
695}
696#endif
697
698
diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h
index 5dd27764eb6f..4c8bdb835fae 100644
--- a/arch/arm/plat-omap/include/plat/usb.h
+++ b/arch/arm/plat-omap/include/plat/usb.h
@@ -102,6 +102,8 @@ extern void usb_ehci_init(const struct usbhs_omap_board_data *pdata);
102 102
103extern void usb_ohci_init(const struct usbhs_omap_board_data *pdata); 103extern void usb_ohci_init(const struct usbhs_omap_board_data *pdata);
104 104
105extern void usbhs_init(const struct usbhs_omap_board_data *pdata);
106
105extern int omap_usbhs_enable(struct device *dev); 107extern int omap_usbhs_enable(struct device *dev);
106extern void omap_usbhs_disable(struct device *dev); 108extern void omap_usbhs_disable(struct device *dev);
107 109