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 /arch/sh/kernel/cpu/sh4a | |
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>
Diffstat (limited to 'arch/sh/kernel/cpu/sh4a')
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7786.c | 83 |
1 files changed, 83 insertions, 0 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 | } |