diff options
author | Anton Vorontsov <avorontsov@ru.mvista.com> | 2008-12-18 11:37:31 -0500 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2008-12-30 12:13:46 -0500 |
commit | c9c5e52d44b3e68effcda4bef4ff23c6be0c001c (patch) | |
tree | eb818535df87c6138f62a0aaf7cacd2a7b59229f /arch/powerpc/platforms/83xx | |
parent | 3d64de9c50619d32eb71d993d23a50b98d12d3c0 (diff) |
powerpc/83xx: Add USB Host/Gadget support for MPC8360E-MDS boards
- Update the device tree per QE USB bindings;
- Add timer (FSL GTM) node;
- Add gpio-controller node for BCSR13 bank (GPIOs on that bank
are used to control the USB transceiver);
- Set up other BCSR registers;
- Configure the QE Par IO.
The work is loosely based on Li Yang's patch[1], which was used
to support peripheral mode only.
[1] http://ozlabs.org/pipermail/linuxppc-dev/2008-August/061357.html
The s-o-b line of the original patch preserved here.
Signed-off-by: Li Yang <leoli@freescale.com>
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms/83xx')
-rw-r--r-- | arch/powerpc/platforms/83xx/mpc836x_mds.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/83xx/mpc836x_mds.c b/arch/powerpc/platforms/83xx/mpc836x_mds.c index c0a09c34956b..09e9d6fb7411 100644 --- a/arch/powerpc/platforms/83xx/mpc836x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc836x_mds.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <asm/udbg.h> | 44 | #include <asm/udbg.h> |
45 | #include <sysdev/fsl_soc.h> | 45 | #include <sysdev/fsl_soc.h> |
46 | #include <sysdev/fsl_pci.h> | 46 | #include <sysdev/fsl_pci.h> |
47 | #include <sysdev/simple_gpio.h> | ||
47 | #include <asm/qe.h> | 48 | #include <asm/qe.h> |
48 | #include <asm/qe_ic.h> | 49 | #include <asm/qe_ic.h> |
49 | 50 | ||
@@ -93,6 +94,16 @@ static void __init mpc836x_mds_setup_arch(void) | |||
93 | 94 | ||
94 | for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;) | 95 | for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;) |
95 | par_io_of_config(np); | 96 | par_io_of_config(np); |
97 | #ifdef CONFIG_QE_USB | ||
98 | /* Must fixup Par IO before QE GPIO chips are registered. */ | ||
99 | par_io_config_pin(1, 2, 1, 0, 3, 0); /* USBOE */ | ||
100 | par_io_config_pin(1, 3, 1, 0, 3, 0); /* USBTP */ | ||
101 | par_io_config_pin(1, 8, 1, 0, 1, 0); /* USBTN */ | ||
102 | par_io_config_pin(1, 10, 2, 0, 3, 0); /* USBRXD */ | ||
103 | par_io_config_pin(1, 9, 2, 1, 3, 0); /* USBRP */ | ||
104 | par_io_config_pin(1, 11, 2, 1, 3, 0); /* USBRN */ | ||
105 | par_io_config_pin(2, 20, 2, 0, 1, 0); /* CLK21 */ | ||
106 | #endif /* CONFIG_QE_USB */ | ||
96 | } | 107 | } |
97 | 108 | ||
98 | if ((np = of_find_compatible_node(NULL, "network", "ucc_geth")) | 109 | if ((np = of_find_compatible_node(NULL, "network", "ucc_geth")) |
@@ -151,6 +162,70 @@ static int __init mpc836x_declare_of_platform_devices(void) | |||
151 | } | 162 | } |
152 | machine_device_initcall(mpc836x_mds, mpc836x_declare_of_platform_devices); | 163 | machine_device_initcall(mpc836x_mds, mpc836x_declare_of_platform_devices); |
153 | 164 | ||
165 | #ifdef CONFIG_QE_USB | ||
166 | static int __init mpc836x_usb_cfg(void) | ||
167 | { | ||
168 | u8 __iomem *bcsr; | ||
169 | struct device_node *np; | ||
170 | const char *mode; | ||
171 | int ret = 0; | ||
172 | |||
173 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc8360mds-bcsr"); | ||
174 | if (!np) | ||
175 | return -ENODEV; | ||
176 | |||
177 | bcsr = of_iomap(np, 0); | ||
178 | of_node_put(np); | ||
179 | if (!bcsr) | ||
180 | return -ENOMEM; | ||
181 | |||
182 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc8323-qe-usb"); | ||
183 | if (!np) { | ||
184 | ret = -ENODEV; | ||
185 | goto err; | ||
186 | } | ||
187 | |||
188 | #define BCSR8_TSEC1M_MASK (0x3 << 6) | ||
189 | #define BCSR8_TSEC1M_RGMII (0x0 << 6) | ||
190 | #define BCSR8_TSEC2M_MASK (0x3 << 4) | ||
191 | #define BCSR8_TSEC2M_RGMII (0x0 << 4) | ||
192 | /* | ||
193 | * Default is GMII (2), but we should set it to RGMII (0) if we use | ||
194 | * USB (Eth PHY is in RGMII mode anyway). | ||
195 | */ | ||
196 | clrsetbits_8(&bcsr[8], BCSR8_TSEC1M_MASK | BCSR8_TSEC2M_MASK, | ||
197 | BCSR8_TSEC1M_RGMII | BCSR8_TSEC2M_RGMII); | ||
198 | |||
199 | #define BCSR13_USBMASK 0x0f | ||
200 | #define BCSR13_nUSBEN 0x08 /* 1 - Disable, 0 - Enable */ | ||
201 | #define BCSR13_USBSPEED 0x04 /* 1 - Full, 0 - Low */ | ||
202 | #define BCSR13_USBMODE 0x02 /* 1 - Host, 0 - Function */ | ||
203 | #define BCSR13_nUSBVCC 0x01 /* 1 - gets VBUS, 0 - supplies VBUS */ | ||
204 | |||
205 | clrsetbits_8(&bcsr[13], BCSR13_USBMASK, BCSR13_USBSPEED); | ||
206 | |||
207 | mode = of_get_property(np, "mode", NULL); | ||
208 | if (mode && !strcmp(mode, "peripheral")) { | ||
209 | setbits8(&bcsr[13], BCSR13_nUSBVCC); | ||
210 | qe_usb_clock_set(QE_CLK21, 48000000); | ||
211 | } else { | ||
212 | setbits8(&bcsr[13], BCSR13_USBMODE); | ||
213 | /* | ||
214 | * The BCSR GPIOs are used to control power and | ||
215 | * speed of the USB transceiver. This is needed for | ||
216 | * the USB Host only. | ||
217 | */ | ||
218 | simple_gpiochip_init("fsl,mpc8360mds-bcsr-gpio"); | ||
219 | } | ||
220 | |||
221 | of_node_put(np); | ||
222 | err: | ||
223 | iounmap(bcsr); | ||
224 | return ret; | ||
225 | } | ||
226 | machine_arch_initcall(mpc836x_mds, mpc836x_usb_cfg); | ||
227 | #endif /* CONFIG_QE_USB */ | ||
228 | |||
154 | static void __init mpc836x_mds_init_IRQ(void) | 229 | static void __init mpc836x_mds_init_IRQ(void) |
155 | { | 230 | { |
156 | struct device_node *np; | 231 | struct device_node *np; |