powerpc/44x: PHY fixup for USB on canyonlands board
authorRupjyoti Sarmah <rsarmah@amcc.com>
Wed, 15 Dec 2010 02:27:10 +0000 (02:27 +0000)
committerJosh Boyer <jwboyer@linux.vnet.ibm.com>
Wed, 2 Feb 2011 11:58:26 +0000 (06:58 -0500)
This fix is a reset for USB PHY that requires some amount of time for power
to be stable on Canyonlands.

Signed-off-by: Rupjyoti Sarmah <rsarmah@apm.com>
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
arch/powerpc/boot/dts/canyonlands.dts
arch/powerpc/platforms/44x/44x.h
arch/powerpc/platforms/44x/Kconfig
arch/powerpc/platforms/44x/Makefile
arch/powerpc/platforms/44x/canyonlands.c [new file with mode: 0644]
arch/powerpc/platforms/44x/ppc44x_simple.c

index 54caec68738219dd3c341fc04d488360f3c22ab7..2779f08313a5b0c0400a2457e72dc39a6eba1cb0 100644 (file)
                                        };
                                };
 
+                               cpld@2,0 {
+                                       compatible = "amcc,ppc460ex-bcsr";
+                                       reg = <2 0x0 0x9>;
+                               };
+
                                ndfc@3,0 {
                                        compatible = "ibm,ndfc";
                                        reg = <0x00000003 0x00000000 0x00002000>;
                                interrupts = <0x3 0x4>;
                        };
 
+                       GPIO0: gpio@ef600b00 {
+                               compatible = "ibm,ppc4xx-gpio";
+                               reg = <0xef600b00 0x00000048>;
+                               gpio-controller;
+                       };
+
                        ZMII0: emac-zmii@ef600d00 {
                                compatible = "ibm,zmii-460ex", "ibm,zmii";
                                reg = <0xef600d00 0x0000000c>;
index dbc4d2b4301abef2791c646f8a597689361fda6f..63f703ecd23c3ee39a70da79b12753c8ee5777c9 100644 (file)
@@ -4,4 +4,8 @@
 extern u8 as1_readb(volatile u8 __iomem  *addr);
 extern void as1_writeb(u8 data, volatile u8 __iomem *addr);
 
+#define GPIO0_OSRH     0xC
+#define GPIO0_TSRH     0x14
+#define GPIO0_ISR1H    0x34
+
 #endif /* __POWERPC_PLATFORMS_44X_44X_H */
index 0f979c5c756b5ab129c5914b81869957d655cfe2..f485fc5f6d5e64a37913592701ca51d37381d6f7 100644 (file)
@@ -115,7 +115,6 @@ config CANYONLANDS
        bool "Canyonlands"
        depends on 44x
        default n
-       select PPC44x_SIMPLE
        select 460EX
        select PCI
        select PPC4xx_PCI_EXPRESS
index c04d16df8488856e4b29d1842577e9ac36fddaaf..553db6007217e59419f9a092c619734d366528a8 100644 (file)
@@ -9,3 +9,4 @@ obj-$(CONFIG_WARP)      += warp.o
 obj-$(CONFIG_XILINX_VIRTEX_5_FXT) += virtex.o
 obj-$(CONFIG_XILINX_ML510) += virtex_ml510.o
 obj-$(CONFIG_ISS4xx)   += iss4xx.o
+obj-$(CONFIG_CANYONLANDS)+= canyonlands.o
diff --git a/arch/powerpc/platforms/44x/canyonlands.c b/arch/powerpc/platforms/44x/canyonlands.c
new file mode 100644 (file)
index 0000000..afc5e8e
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * This contain platform specific code for APM PPC460EX based Canyonlands
+ * board.
+ *
+ * Copyright (c) 2010, Applied Micro Circuits Corporation
+ * Author: Rupjyoti Sarmah <rsarmah@apm.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <asm/pci-bridge.h>
+#include <asm/ppc4xx.h>
+#include <asm/udbg.h>
+#include <asm/uic.h>
+#include <linux/of_platform.h>
+#include <linux/delay.h>
+#include "44x.h"
+
+#define BCSR_USB_EN    0x11
+
+static __initdata struct of_device_id ppc460ex_of_bus[] = {
+       { .compatible = "ibm,plb4", },
+       { .compatible = "ibm,opb", },
+       { .compatible = "ibm,ebc", },
+       { .compatible = "simple-bus", },
+       {},
+};
+
+static int __init ppc460ex_device_probe(void)
+{
+       of_platform_bus_probe(NULL, ppc460ex_of_bus, NULL);
+
+       return 0;
+}
+machine_device_initcall(canyonlands, ppc460ex_device_probe);
+
+/* Using this code only for the Canyonlands board.  */
+
+static int __init ppc460ex_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+       if (of_flat_dt_is_compatible(root, "amcc,canyonlands")) {
+               ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
+               return 1;
+               }
+       return 0;
+}
+
+/* USB PHY fixup code on Canyonlands kit. */
+
+static int __init ppc460ex_canyonlands_fixup(void)
+{
+       u8 __iomem *bcsr ;
+       void __iomem *vaddr;
+       struct device_node *np;
+       int ret = 0;
+
+       np = of_find_compatible_node(NULL, NULL, "amcc,ppc460ex-bcsr");
+       if (!np) {
+               printk(KERN_ERR "failed did not find amcc, ppc460ex bcsr node\n");
+               return -ENODEV;
+       }
+
+       bcsr = of_iomap(np, 0);
+       of_node_put(np);
+
+       if (!bcsr) {
+               printk(KERN_CRIT "Could not remap bcsr\n");
+               ret = -ENODEV;
+               goto err_bcsr;
+       }
+
+       np = of_find_compatible_node(NULL, NULL, "ibm,ppc4xx-gpio");
+       if (!np) {
+               printk(KERN_ERR "failed did not find ibm,ppc4xx-gpio node\n");
+               return -ENODEV;
+       }
+
+       vaddr = of_iomap(np, 0);
+       of_node_put(np);
+
+       if (!vaddr) {
+               printk(KERN_CRIT "Could not get gpio node address\n");
+               ret = -ENODEV;
+               goto err_gpio;
+       }
+       /* Disable USB, through the BCSR7 bits */
+       setbits8(&bcsr[7], BCSR_USB_EN);
+
+       /* Wait for a while after reset */
+       msleep(100);
+
+       /* Enable USB here */
+       clrbits8(&bcsr[7], BCSR_USB_EN);
+
+       /*
+        * Configure multiplexed gpio16 and gpio19 as alternate1 output
+        * source after USB reset. In this configuration gpio16 will be
+        * USB2HStop and gpio19 will be USB2DStop. For more details refer to
+        * table 34-7 of PPC460EX user manual.
+        */
+       setbits32((vaddr + GPIO0_OSRH), 0x42000000);
+       setbits32((vaddr + GPIO0_TSRH), 0x42000000);
+err_gpio:
+       iounmap(vaddr);
+err_bcsr:
+       iounmap(bcsr);
+       return ret;
+}
+machine_device_initcall(canyonlands, ppc460ex_canyonlands_fixup);
+define_machine(canyonlands) {
+       .name = "Canyonlands",
+       .probe = ppc460ex_probe,
+       .progress = udbg_progress,
+       .init_IRQ = uic_init_tree,
+       .get_irq = uic_get_irq,
+       .restart = ppc4xx_reset_system,
+       .calibrate_decr = generic_calibrate_decr,
+};
index 7ddcba3b93976c5ad46ba99ea7688b4d59786476..c81c19c0b3d41b282533d36fa3392380089f854f 100644 (file)
@@ -53,7 +53,6 @@ static char *board[] __initdata = {
        "amcc,arches",
        "amcc,bamboo",
        "amcc,bluestone",
-       "amcc,canyonlands",
        "amcc,glacier",
        "ibm,ebony",
        "amcc,eiger",