diff options
author | Sylvain Munaut <tnt@246tnt.com> | 2005-03-30 16:29:56 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-03-30 16:29:56 -0800 |
commit | 6e307b33f548c97d26b8d0218cce12f0961448ae (patch) | |
tree | edbdda6a1adc743809d178dd59c1e0064734d865 | |
parent | 845faaf7555d8a5be0ca0fb0e21d2e4fd690fdff (diff) | |
download | history-6e307b33f548c97d26b8d0218cce12f0961448ae.tar.gz |
[PATCH] ppc32: Adds necessary cpu init to use USB on LITE5200 Platform
To use external peripheral on MPC5200, some clocking registers and port-muxing
must be done. Since this is platform specific, it's placed the platform
support file. This particular patch is for USB support on the LITE5200.
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Signed-off-by: Kumar Gala <kumar.gala@freescale.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | arch/ppc/platforms/lite5200.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/arch/ppc/platforms/lite5200.c b/arch/ppc/platforms/lite5200.c index 4ea7eb9e31c5c..b604cf8b3cae9 100644 --- a/arch/ppc/platforms/lite5200.c +++ b/arch/ppc/platforms/lite5200.c @@ -79,21 +79,47 @@ lite5200_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) static void __init lite5200_setup_cpu(void) { + struct mpc52xx_cdm __iomem *cdm; + struct mpc52xx_gpio __iomem *gpio; struct mpc52xx_intr __iomem *intr; struct mpc52xx_xlb __iomem *xlb; + u32 port_config; u32 intr_ctrl; /* Map zones */ + cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE); + gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE); xlb = ioremap(MPC52xx_PA(MPC52xx_XLB_OFFSET), MPC52xx_XLB_SIZE); intr = ioremap(MPC52xx_PA(MPC52xx_INTR_OFFSET), MPC52xx_INTR_SIZE); - if (!xlb || !intr) { - printk("lite5200.c: Error while mapping XLB/INTR during " + if (!cdm || !gpio || !xlb || !intr) { + printk("lite5200.c: Error while mapping CDM/GPIO/XLB/INTR during" "lite5200_setup_cpu\n"); goto unmap_regs; } + /* Use internal 48 Mhz */ + out_8(&cdm->ext_48mhz_en, 0x00); + out_8(&cdm->fd_enable, 0x01); + if (in_be32(&cdm->rstcfg) & 0x40) /* Assumes 33Mhz clock */ + out_be16(&cdm->fd_counters, 0x0001); + else + out_be16(&cdm->fd_counters, 0x5555); + + /* Get port mux config */ + port_config = in_be32(&gpio->port_config); + + /* 48Mhz internal, pin is GPIO */ + port_config &= ~0x00800000; + + /* USB port */ + port_config &= ~0x00007000; /* Differential mode - USB1 only */ + port_config |= 0x00001000; + + /* Commit port config */ + out_be32(&gpio->port_config, port_config); + /* Configure the XLB Arbiter */ out_be32(&xlb->master_pri_enable, 0xff); out_be32(&xlb->master_priority, 0x11111111); @@ -111,6 +137,8 @@ lite5200_setup_cpu(void) /* Unmap reg zone */ unmap_regs: + if (cdm) iounmap(cdm); + if (gpio) iounmap(gpio); if (xlb) iounmap(xlb); if (intr) iounmap(intr); } @@ -171,7 +199,11 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5, isa_mem_base = 0; /* Powersave */ - powersave_nap = 1; /* We allow this platform to NAP */ + /* This is provided as an example on how to do it. But you + need to be aware that NAP disable bus snoop and that may + be required for some devices to work properly, like USB ... */ + /* powersave_nap = 1; */ + /* Setup the ppc_md struct */ ppc_md.setup_arch = lite5200_setup_arch; |