diff options
| author | Kuninori Morimoto <morimoto.kuninori@renesas.com> | 2009-03-12 04:40:15 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2009-03-16 06:40:34 -0400 |
| commit | 4c3f450ba4e4c00df91f98664b58f9a98dc049fd (patch) | |
| tree | 383e138887b318d6d653382980bb32af36f32f56 | |
| parent | 600fa578a95f65bc1f2a03210d3d418747024b43 (diff) | |
sh: Add OHCI USB support for SH7786
Signed-off-by: Kuninori Morimoto <morimoto.kuninori@renesas.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
| -rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7786.c | 83 | ||||
| -rw-r--r-- | drivers/usb/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hcd.c | 3 |
3 files changed, 86 insertions, 1 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 249b99e1adb5..5a47e1cf442e 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/serial_sci.h> | 18 | #include <linux/serial_sci.h> |
| 19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
| 20 | #include <linux/mm.h> | 20 | #include <linux/mm.h> |
| 21 | #include <linux/dma-mapping.h> | ||
| 21 | #include <asm/mmzone.h> | 22 | #include <asm/mmzone.h> |
| 22 | 23 | ||
| 23 | static struct plat_sci_port sci_platform_data[] = { | 24 | static struct plat_sci_port sci_platform_data[] = { |
| @@ -68,12 +69,94 @@ static struct platform_device sci_device = { | |||
| 68 | }, | 69 | }, |
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| 72 | static struct resource usb_ohci_resources[] = { | ||
| 73 | [0] = { | ||
| 74 | .start = 0xffe70400, | ||
| 75 | .end = 0xffe704ff, | ||
| 76 | .flags = IORESOURCE_MEM, | ||
| 77 | }, | ||
| 78 | [1] = { | ||
| 79 | .start = 77, | ||
| 80 | .end = 77, | ||
| 81 | .flags = IORESOURCE_IRQ, | ||
| 82 | }, | ||
| 83 | }; | ||
| 84 | |||
| 85 | static u64 usb_ohci_dma_mask = DMA_BIT_MASK(32); | ||
| 86 | static struct platform_device usb_ohci_device = { | ||
| 87 | .name = "sh_ohci", | ||
| 88 | .id = -1, | ||
| 89 | .dev = { | ||
| 90 | .dma_mask = &usb_ohci_dma_mask, | ||
| 91 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 92 | }, | ||
| 93 | .num_resources = ARRAY_SIZE(usb_ohci_resources), | ||
| 94 | .resource = usb_ohci_resources, | ||
| 95 | }; | ||
| 96 | |||
| 71 | static struct platform_device *sh7786_devices[] __initdata = { | 97 | static struct platform_device *sh7786_devices[] __initdata = { |
| 72 | &sci_device, | 98 | &sci_device, |
| 99 | &usb_ohci_device, | ||
| 73 | }; | 100 | }; |
| 74 | 101 | ||
| 102 | |||
| 103 | /* | ||
| 104 | * Please call this function if your platform board | ||
| 105 | * use external clock for USB | ||
| 106 | * */ | ||
| 107 | #define USBCTL0 0xffe70858 | ||
| 108 | #define CLOCK_MODE_MASK 0xffffff7f | ||
| 109 | #define EXT_CLOCK_MODE 0x00000080 | ||
| 110 | void __init sh7786_usb_use_exclock(void) | ||
| 111 | { | ||
| 112 | u32 val = __raw_readl(USBCTL0) & CLOCK_MODE_MASK; | ||
| 113 | __raw_writel(val | EXT_CLOCK_MODE, USBCTL0); | ||
| 114 | } | ||
| 115 | |||
| 116 | #define USBINITREG1 0xffe70094 | ||
| 117 | #define USBINITREG2 0xffe7009c | ||
| 118 | #define USBINITVAL1 0x00ff0040 | ||
| 119 | #define USBINITVAL2 0x00000001 | ||
| 120 | |||
| 121 | #define USBPCTL1 0xffe70804 | ||
| 122 | #define USBST 0xffe70808 | ||
| 123 | #define PHY_ENB 0x00000001 | ||
| 124 | #define PLL_ENB 0x00000002 | ||
| 125 | #define PHY_RST 0x00000004 | ||
| 126 | #define ACT_PLL_STATUS 0xc0000000 | ||
| 127 | static void __init sh7786_usb_setup(void) | ||
| 128 | { | ||
| 129 | int i = 1000000; | ||
| 130 | |||
| 131 | /* | ||
| 132 | * USB initial settings | ||
| 133 | * | ||
| 134 | * The following settings are necessary | ||
| 135 | * for using the USB modules. | ||
| 136 | * | ||
| 137 | * see "USB Inital Settings" for detail | ||
| 138 | */ | ||
| 139 | __raw_writel(USBINITVAL1, USBINITREG1); | ||
| 140 | __raw_writel(USBINITVAL2, USBINITREG2); | ||
| 141 | |||
| 142 | /* | ||
| 143 | * Set the PHY and PLL enable bit | ||
| 144 | */ | ||
| 145 | __raw_writel(PHY_ENB | PLL_ENB, USBPCTL1); | ||
| 146 | while (i-- && | ||
| 147 | ((__raw_readl(USBST) & ACT_PLL_STATUS) != ACT_PLL_STATUS)) | ||
| 148 | cpu_relax(); | ||
| 149 | |||
| 150 | if (i) { | ||
| 151 | /* Set the PHY RST bit */ | ||
| 152 | __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1); | ||
| 153 | printk(KERN_INFO "sh7786 usb setup done\n"); | ||
| 154 | } | ||
| 155 | } | ||
| 156 | |||
| 75 | static int __init sh7786_devices_setup(void) | 157 | static int __init sh7786_devices_setup(void) |
| 76 | { | 158 | { |
| 159 | sh7786_usb_setup(); | ||
| 77 | return platform_add_devices(sh7786_devices, | 160 | return platform_add_devices(sh7786_devices, |
| 78 | ARRAY_SIZE(sh7786_devices)); | 161 | ARRAY_SIZE(sh7786_devices)); |
| 79 | } | 162 | } |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 83babb0a1df7..c6c816b7ecb5 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
| @@ -47,6 +47,7 @@ config USB_ARCH_HAS_OHCI | |||
| 47 | default y if CPU_SUBTYPE_SH7720 | 47 | default y if CPU_SUBTYPE_SH7720 |
| 48 | default y if CPU_SUBTYPE_SH7721 | 48 | default y if CPU_SUBTYPE_SH7721 |
| 49 | default y if CPU_SUBTYPE_SH7763 | 49 | default y if CPU_SUBTYPE_SH7763 |
| 50 | default y if CPU_SUBTYPE_SH7786 | ||
| 50 | # more: | 51 | # more: |
| 51 | default PCI | 52 | default PCI |
| 52 | 53 | ||
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 5cf5f1eca4f4..7658589edb1c 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -1049,7 +1049,8 @@ MODULE_LICENSE ("GPL"); | |||
| 1049 | 1049 | ||
| 1050 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | 1050 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \ |
| 1051 | defined(CONFIG_CPU_SUBTYPE_SH7721) || \ | 1051 | defined(CONFIG_CPU_SUBTYPE_SH7721) || \ |
| 1052 | defined(CONFIG_CPU_SUBTYPE_SH7763) | 1052 | defined(CONFIG_CPU_SUBTYPE_SH7763) || \ |
| 1053 | defined(CONFIG_CPU_SUBTYPE_SH7786) | ||
| 1053 | #include "ohci-sh.c" | 1054 | #include "ohci-sh.c" |
| 1054 | #define PLATFORM_DRIVER ohci_hcd_sh_driver | 1055 | #define PLATFORM_DRIVER ohci_hcd_sh_driver |
| 1055 | #endif | 1056 | #endif |
