| 
									
										
										
										
											2007-10-19 19:38:45 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * arch/powerpc/platforms/83xx/mpc837x_mds.c | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * MPC837x MDS board specific routines | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify it | 
					
						
							|  |  |  |  * under the terms of the GNU General Public License as published by the | 
					
						
							|  |  |  |  * Free Software Foundation;  either version 2 of the License, or (at your | 
					
						
							|  |  |  |  * option) any later version. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/pci.h>
 | 
					
						
							|  |  |  | #include <linux/of.h>
 | 
					
						
							|  |  |  | #include <linux/of_platform.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/time.h>
 | 
					
						
							|  |  |  | #include <asm/ipic.h>
 | 
					
						
							|  |  |  | #include <asm/udbg.h>
 | 
					
						
							|  |  |  | #include <asm/prom.h>
 | 
					
						
							| 
									
										
										
										
											2008-06-26 11:07:57 -06:00
										 |  |  | #include <sysdev/fsl_pci.h>
 | 
					
						
							| 
									
										
										
										
											2007-10-19 19:38:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "mpc83xx.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-08 15:18:45 +08:00
										 |  |  | #define BCSR12_USB_SER_MASK	0x8a
 | 
					
						
							|  |  |  | #define BCSR12_USB_SER_PIN	0x80
 | 
					
						
							|  |  |  | #define BCSR12_USB_SER_DEVICE	0x02
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int mpc837xmds_usb_cfg(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct device_node *np; | 
					
						
							|  |  |  | 	const void *phy_type, *mode; | 
					
						
							|  |  |  | 	void __iomem *bcsr_regs = NULL; | 
					
						
							|  |  |  | 	u8 bcsr12; | 
					
						
							|  |  |  | 	int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ret = mpc837x_usb_cfg(); | 
					
						
							|  |  |  | 	if (ret) | 
					
						
							|  |  |  | 		return ret; | 
					
						
							|  |  |  | 	/* Map BCSR area */ | 
					
						
							| 
									
										
										
										
											2008-03-06 18:42:35 +08:00
										 |  |  | 	np = of_find_compatible_node(NULL, NULL, "fsl,mpc837xmds-bcsr"); | 
					
						
							| 
									
										
										
										
											2008-01-08 15:18:45 +08:00
										 |  |  | 	if (np) { | 
					
						
							| 
									
										
										
										
											2008-03-06 18:42:35 +08:00
										 |  |  | 		bcsr_regs = of_iomap(np, 0); | 
					
						
							| 
									
										
										
										
											2008-01-08 15:18:45 +08:00
										 |  |  | 		of_node_put(np); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (!bcsr_regs) | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	np = of_find_node_by_name(NULL, "usb"); | 
					
						
							| 
									
										
										
										
											2010-08-29 21:47:18 +02:00
										 |  |  | 	if (!np) { | 
					
						
							|  |  |  | 		ret = -ENODEV; | 
					
						
							|  |  |  | 		goto out; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-01-08 15:18:45 +08:00
										 |  |  | 	phy_type = of_get_property(np, "phy_type", NULL); | 
					
						
							|  |  |  | 	if (phy_type && !strcmp(phy_type, "ulpi")) { | 
					
						
							|  |  |  | 		clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN); | 
					
						
							|  |  |  | 	} else if (phy_type && !strcmp(phy_type, "serial")) { | 
					
						
							|  |  |  | 		mode = of_get_property(np, "dr_mode", NULL); | 
					
						
							|  |  |  | 		bcsr12 = in_8(bcsr_regs + 12) & ~BCSR12_USB_SER_MASK; | 
					
						
							|  |  |  | 		bcsr12 |= BCSR12_USB_SER_PIN; | 
					
						
							|  |  |  | 		if (mode && !strcmp(mode, "peripheral")) | 
					
						
							|  |  |  | 			bcsr12 |= BCSR12_USB_SER_DEVICE; | 
					
						
							|  |  |  | 		out_8(bcsr_regs + 12, bcsr12); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		printk(KERN_ERR "USB DR: unsupported PHY\n"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	of_node_put(np); | 
					
						
							| 
									
										
										
										
											2010-08-29 21:47:18 +02:00
										 |  |  | out: | 
					
						
							| 
									
										
										
										
											2008-01-08 15:18:45 +08:00
										 |  |  | 	iounmap(bcsr_regs); | 
					
						
							| 
									
										
										
										
											2010-08-29 21:47:18 +02:00
										 |  |  | 	return ret; | 
					
						
							| 
									
										
										
										
											2008-01-08 15:18:45 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-19 19:38:45 +08:00
										 |  |  | /* ************************************************************************
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Setup the architecture | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static void __init mpc837x_mds_setup_arch(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (ppc_md.progress) | 
					
						
							|  |  |  | 		ppc_md.progress("mpc837x_mds_setup_arch()", 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-17 18:48:48 +04:00
										 |  |  | 	mpc83xx_setup_pci(); | 
					
						
							| 
									
										
										
										
											2008-01-08 15:18:45 +08:00
										 |  |  | 	mpc837xmds_usb_cfg(); | 
					
						
							| 
									
										
										
										
											2007-10-19 19:38:45 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-17 18:48:47 +04:00
										 |  |  | machine_device_initcall(mpc837x_mds, mpc83xx_declare_of_platform_devices); | 
					
						
							| 
									
										
										
										
											2007-10-19 19:38:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Called very early, MMU is off, device-tree isn't unflattened | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static int __init mpc837x_mds_probe(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |         unsigned long root = of_get_flat_dt_root(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return of_flat_dt_is_compatible(root, "fsl,mpc837xmds"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | define_machine(mpc837x_mds) { | 
					
						
							|  |  |  | 	.name			= "MPC837x MDS", | 
					
						
							|  |  |  | 	.probe			= mpc837x_mds_probe, | 
					
						
							|  |  |  | 	.setup_arch		= mpc837x_mds_setup_arch, | 
					
						
							| 
									
										
										
										
											2011-07-22 23:55:42 +04:00
										 |  |  | 	.init_IRQ		= mpc83xx_ipic_init_IRQ, | 
					
						
							| 
									
										
										
										
											2007-10-19 19:38:45 +08:00
										 |  |  | 	.get_irq		= ipic_get_irq, | 
					
						
							|  |  |  | 	.restart		= mpc83xx_restart, | 
					
						
							|  |  |  | 	.time_init		= mpc83xx_time_init, | 
					
						
							|  |  |  | 	.calibrate_decr		= generic_calibrate_decr, | 
					
						
							|  |  |  | 	.progress		= udbg_progress, | 
					
						
							|  |  |  | }; |