summaryrefslogtreecommitdiff
path: root/cpu/mpc83xx
diff options
context:
space:
mode:
Diffstat (limited to 'cpu/mpc83xx')
-rw-r--r--cpu/mpc83xx/Makefile2
-rw-r--r--cpu/mpc83xx/cpu.c426
-rw-r--r--cpu/mpc83xx/fdt.c72
-rw-r--r--cpu/mpc83xx/pci.c83
4 files changed, 103 insertions, 480 deletions
diff --git a/cpu/mpc83xx/Makefile b/cpu/mpc83xx/Makefile
index 2329970..94a3cb8 100644
--- a/cpu/mpc83xx/Makefile
+++ b/cpu/mpc83xx/Makefile
@@ -29,7 +29,7 @@ LIB = $(obj)lib$(CPU).a
START = start.o
COBJS = traps.o cpu.o cpu_init.o speed.o interrupts.o \
- spd_sdram.o ecc.o qe_io.o pci.o
+ spd_sdram.o ecc.o qe_io.o pci.o fdt.o
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
diff --git a/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c
index 3d3f20a..bff3cef 100644
--- a/cpu/mpc83xx/cpu.c
+++ b/cpu/mpc83xx/cpu.c
@@ -31,12 +31,7 @@
#include <command.h>
#include <mpc83xx.h>
#include <asm/processor.h>
-#if defined(CONFIG_OF_FLAT_TREE)
-#include <ft_build.h>
-#elif defined(CONFIG_OF_LIBFDT)
#include <libfdt.h>
-#include <fdt_support.h>
-#endif
DECLARE_GLOBAL_DATA_PTR;
@@ -359,427 +354,6 @@ void watchdog_reset (void)
}
#endif
-#if defined(CONFIG_OF_LIBFDT)
-
-/*
- * "Setter" functions used to add/modify FDT entries.
- */
-static int fdt_set_eth0(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- /* Fix it up if it exists, don't create it if it doesn't exist */
- if (fdt_get_property(blob, nodeoffset, name, 0)) {
- return fdt_setprop(blob, nodeoffset, name, bd->bi_enetaddr, 6);
- }
- return 0;
-}
-#ifdef CONFIG_HAS_ETH1
-/* second onboard ethernet port */
-static int fdt_set_eth1(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- /* Fix it up if it exists, don't create it if it doesn't exist */
- if (fdt_get_property(blob, nodeoffset, name, 0)) {
- return fdt_setprop(blob, nodeoffset, name, bd->bi_enet1addr, 6);
- }
- return 0;
-}
-#endif
-#ifdef CONFIG_HAS_ETH2
-/* third onboard ethernet port */
-static int fdt_set_eth2(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- /* Fix it up if it exists, don't create it if it doesn't exist */
- if (fdt_get_property(blob, nodeoffset, name, 0)) {
- return fdt_setprop(blob, nodeoffset, name, bd->bi_enet2addr, 6);
- }
- return 0;
-}
-#endif
-#ifdef CONFIG_HAS_ETH3
-/* fourth onboard ethernet port */
-static int fdt_set_eth3(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- /* Fix it up if it exists, don't create it if it doesn't exist */
- if (fdt_get_property(blob, nodeoffset, name, 0)) {
- return fdt_setprop(blob, nodeoffset, name, bd->bi_enet3addr, 6);
- }
- return 0;
-}
-#endif
-
-static int fdt_set_busfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- u32 tmp;
- /* Create or update the property */
- tmp = cpu_to_be32(bd->bi_busfreq);
- return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));
-}
-
-static int fdt_set_tbfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- u32 tmp;
- /* Create or update the property */
- tmp = cpu_to_be32(OF_TBCLK);
- return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));
-}
-
-
-static int fdt_set_clockfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- u32 tmp;
- /* Create or update the property */
- tmp = cpu_to_be32(gd->core_clk);
- return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));
-}
-
-#ifdef CONFIG_QE
-static int fdt_set_qe_busfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- u32 tmp;
- /* Create or update the property */
- tmp = cpu_to_be32(gd->qe_clk);
- return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));
-}
-
-static int fdt_set_qe_brgfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)
-{
- u32 tmp;
- /* Create or update the property */
- tmp = cpu_to_be32(gd->brg_clk);
- return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));
-}
-#endif
-
-/*
- * Fixups to the fdt.
- */
-static const struct {
- char *node;
- char *prop;
- int (*set_fn)(void *blob, int nodeoffset, const char *name, bd_t *bd);
-} fixup_props[] = {
- { "/cpus/" OF_CPU,
- "timebase-frequency",
- fdt_set_tbfreq
- },
- { "/cpus/" OF_CPU,
- "bus-frequency",
- fdt_set_busfreq
- },
- { "/cpus/" OF_CPU,
- "clock-frequency",
- fdt_set_clockfreq
- },
- { "/" OF_SOC,
- "bus-frequency",
- fdt_set_busfreq
- },
- { "/" OF_SOC "/serial@4500",
- "clock-frequency",
- fdt_set_busfreq
- },
- { "/" OF_SOC "/serial@4600",
- "clock-frequency",
- fdt_set_busfreq
- },
-#ifdef CONFIG_TSEC1
- { "/" OF_SOC "/ethernet@24000",
- "mac-address",
- fdt_set_eth0
- },
- { "/" OF_SOC "/ethernet@24000",
- "local-mac-address",
- fdt_set_eth0
- },
-#endif
-#ifdef CONFIG_TSEC2
- { "/" OF_SOC "/ethernet@25000",
- "mac-address",
- fdt_set_eth1
- },
- { "/" OF_SOC "/ethernet@25000",
- "local-mac-address",
- fdt_set_eth1
- },
-#endif
-#ifdef CONFIG_QE
- { "/" OF_QE,
- "brg-frequency",
- fdt_set_qe_brgfreq
- },
- { "/" OF_QE,
- "bus-frequency",
- fdt_set_qe_busfreq
- },
-#ifdef CONFIG_UEC_ETH1
-#if CFG_UEC1_UCC_NUM == 0 /* UCC1 */
- { "/" OF_QE "/ucc@2000",
- "mac-address",
- fdt_set_eth0
- },
- { "/" OF_QE "/ucc@2000",
- "local-mac-address",
- fdt_set_eth0
- },
-#elif CFG_UEC1_UCC_NUM == 1 /* UCC2 */
- { "/" OF_QE "/ucc@3000",
- "mac-address",
- fdt_set_eth0
- },
- { "/" OF_QE "/ucc@3000",
- "local-mac-address",
- fdt_set_eth0
- },
-#elif CFG_UEC1_UCC_NUM == 2 /* UCC3 */
- { "/" OF_QE "/ucc@2200",
- "mac-address",
- fdt_set_eth0
- },
- { "/" OF_QE "/ucc@2200",
- "local-mac-address",
- fdt_set_eth0
- },
-#elif CFG_UEC1_UCC_NUM == 3 /* UCC4 */
- { "/" OF_QE "/ucc@3200",
- "mac-address",
- fdt_set_eth0
- },
- { "/" OF_QE "/ucc@3200",
- "local-mac-address",
- fdt_set_eth0
- },
-#endif
-#endif /* CONFIG_UEC_ETH1 */
-#ifdef CONFIG_UEC_ETH2
-#if CFG_UEC2_UCC_NUM == 0 /* UCC1 */
- { "/" OF_QE "/ucc@2000",
- "mac-address",
- fdt_set_eth1
- },
- { "/" OF_QE "/ucc@2000",
- "local-mac-address",
- fdt_set_eth1
- },
-#elif CFG_UEC2_UCC_NUM == 1 /* UCC2 */
- { "/" OF_QE "/ucc@3000",
- "mac-address",
- fdt_set_eth1
- },
- { "/" OF_QE "/ucc@3000",
- "local-mac-address",
- fdt_set_eth1
- },
-#elif CFG_UEC2_UCC_NUM == 2 /* UCC3 */
- { "/" OF_QE "/ucc@2200",
- "mac-address",
- fdt_set_eth1
- },
- { "/" OF_QE "/ucc@2200",
- "local-mac-address",
- fdt_set_eth1
- },
-#elif CFG_UEC2_UCC_NUM == 3 /* UCC4 */
- { "/" OF_QE "/ucc@3200",
- "mac-address",
- fdt_set_eth1
- },
- { "/" OF_QE "/ucc@3200",
- "local-mac-address",
- fdt_set_eth1
- },
-#endif
-#endif /* CONFIG_UEC_ETH2 */
-#ifdef CONFIG_UEC_ETH3
-#if CFG_UEC3_UCC_NUM == 0 /* UCC1 */
- { "/" OF_QE "/ucc@2000",
- "mac-address",
- fdt_set_eth2
- },
- { "/" OF_QE "/ucc@2000",
- "local-mac-address",
- fdt_set_eth2
- },
-#elif CFG_UEC3_UCC_NUM == 1 /* UCC2 */
- { "/" OF_QE "/ucc@3000",
- "mac-address",
- fdt_set_eth2
- },
- { "/" OF_QE "/ucc@3000",
- "local-mac-address",
- fdt_set_eth2
- },
-#elif CFG_UEC3_UCC_NUM == 2 /* UCC3 */
- { "/" OF_QE "/ucc@2200",
- "mac-address",
- fdt_set_eth2
- },
- { "/" OF_QE "/ucc@2200",
- "local-mac-address",
- fdt_set_eth2
- },
-#elif CFG_UEC3_UCC_NUM == 3 /* UCC4 */
- { "/" OF_QE "/ucc@3200",
- "mac-address",
- fdt_set_eth2
- },
- { "/" OF_QE "/ucc@3200",
- "local-mac-address",
- fdt_set_eth2
- },
-#endif
-#endif /* CONFIG_UEC_ETH3 */
-#ifdef CONFIG_UEC_ETH4
-#if CFG_UEC4_UCC_NUM == 0 /* UCC1 */
- { "/" OF_QE "/ucc@2000",
- "mac-address",
- fdt_set_eth3
- },
- { "/" OF_QE "/ucc@2000",
- "local-mac-address",
- fdt_set_eth3
- },
-#elif CFG_UEC4_UCC_NUM == 1 /* UCC2 */
- { "/" OF_QE "/ucc@3000",
- "mac-address",
- fdt_set_eth3
- },
- { "/" OF_QE "/ucc@3000",
- "local-mac-address",
- fdt_set_eth3
- },
-#elif CFG_UEC4_UCC_NUM == 2 /* UCC3 */
- { "/" OF_QE "/ucc@2200",
- "mac-address",
- fdt_set_eth3
- },
- { "/" OF_QE "/ucc@2200",
- "local-mac-address",
- fdt_set_eth3
- },
-#elif CFG_UEC4_UCC_NUM == 3 /* UCC4 */
- { "/" OF_QE "/ucc@3200",
- "mac-address",
- fdt_set_eth3
- },
- { "/" OF_QE "/ucc@3200",
- "local-mac-address",
- fdt_set_eth3
- },
-#endif
-#endif /* CONFIG_UEC_ETH4 */
-#endif /* CONFIG_QE */
-};
-
-void
-ft_cpu_setup(void *blob, bd_t *bd)
-{
- int nodeoffset;
- int err;
- int j;
-
- for (j = 0; j < (sizeof(fixup_props) / sizeof(fixup_props[0])); j++) {
- nodeoffset = fdt_path_offset(blob, fixup_props[j].node);
- if (nodeoffset >= 0) {
- err = fixup_props[j].set_fn(blob, nodeoffset,
- fixup_props[j].prop, bd);
- if (err < 0)
- debug("Problem setting %s = %s: %s\n",
- fixup_props[j].node, fixup_props[j].prop,
- fdt_strerror(err));
- } else {
- debug("Couldn't find %s: %s\n",
- fixup_props[j].node, fdt_strerror(nodeoffset));
- }
- }
-
- fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
-}
-#elif defined(CONFIG_OF_FLAT_TREE)
-void
-ft_cpu_setup(void *blob, bd_t *bd)
-{
- u32 *p;
- int len;
- ulong clock;
-
- clock = bd->bi_busfreq;
- p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len);
- if (p != NULL)
- *p = cpu_to_be32(clock);
-
- p = ft_get_prop(blob, "/" OF_SOC "/bus-frequency", &len);
- if (p != NULL)
- *p = cpu_to_be32(clock);
-
- p = ft_get_prop(blob, "/" OF_SOC "/serial@4500/clock-frequency", &len);
- if (p != NULL)
- *p = cpu_to_be32(clock);
-
- p = ft_get_prop(blob, "/" OF_SOC "/serial@4600/clock-frequency", &len);
- if (p != NULL)
- *p = cpu_to_be32(clock);
-
-#ifdef CONFIG_TSEC1
- p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enetaddr, 6);
-
- p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enetaddr, 6);
-#endif
-
-#ifdef CONFIG_TSEC2
- p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enet1addr, 6);
-
- p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/local-mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enet1addr, 6);
-#endif
-
-#ifdef CONFIG_UEC_ETH1
-#if CFG_UEC1_UCC_NUM == 0 /* UCC1 */
- p = ft_get_prop(blob, "/" OF_QE "/ucc@2000/mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enetaddr, 6);
-
- p = ft_get_prop(blob, "/" OF_QE "/ucc@2000/local-mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enetaddr, 6);
-#elif CFG_UEC1_UCC_NUM == 2 /* UCC3 */
- p = ft_get_prop(blob, "/" OF_QE "/ucc@2200/mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enetaddr, 6);
-
- p = ft_get_prop(blob, "/" OF_QE "/ucc@2200/local-mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enetaddr, 6);
-#endif
-#endif
-
-#ifdef CONFIG_UEC_ETH2
-#if CFG_UEC2_UCC_NUM == 1 /* UCC2 */
- p = ft_get_prop(blob, "/" OF_QE "/ucc@3000/mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enet1addr, 6);
-
- p = ft_get_prop(blob, "/" OF_QE "/ucc@3000/local-mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enet1addr, 6);
-#elif CFG_UEC2_UCC_NUM == 3 /* UCC4 */
- p = ft_get_prop(blob, "/" OF_QE "/ucc@3200/mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enet1addr, 6);
-
- p = ft_get_prop(blob, "/" OF_QE "/ucc@3200/local-mac-address", &len);
- if (p != NULL)
- memcpy(p, bd->bi_enet1addr, 6);
-#endif
-#endif
-}
-#endif
-
#if defined(CONFIG_DDR_ECC)
void dma_init(void)
{
diff --git a/cpu/mpc83xx/fdt.c b/cpu/mpc83xx/fdt.c
new file mode 100644
index 0000000..f21c54e
--- /dev/null
+++ b/cpu/mpc83xx/fdt.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ *
+ * (C) Copyright 2000
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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 <common.h>
+
+#if defined(CONFIG_OF_LIBFDT)
+
+#include <libfdt.h>
+#include <fdt_support.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void ft_cpu_setup(void *blob, bd_t *bd)
+{
+#if defined(CONFIG_HAS_ETH0) || defined(CONFIG_HAS_ETH1) ||\
+ defined(CONFIG_HAS_ETH2) || defined(CONFIG_HAS_ETH3)
+ fdt_fixup_ethernet(blob, bd);
+#endif
+
+ do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,
+ "timebase-frequency", (bd->bi_busfreq / 4), 1);
+ do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,
+ "bus-frequency", bd->bi_busfreq, 1);
+ do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,
+ "clock-frequency", gd->core_clk, 1);
+ do_fixup_by_prop_u32(blob, "device_type", "soc", 4,
+ "bus-frequency", bd->bi_busfreq, 1);
+#ifdef CONFIG_QE
+ do_fixup_by_prop_u32(blob, "device_type", "qe", 4,
+ "bus-frequency", gd->qe_clk, 1);
+ do_fixup_by_prop_u32(blob, "device_type", "qe", 4,
+ "brg-frequency", gd->brg_clk, 1);
+#endif
+
+#ifdef CFG_NS16550
+ do_fixup_by_compat_u32(blob, "ns16550",
+ "clock-frequency", bd->bi_busfreq, 1);
+#endif
+
+#ifdef CONFIG_CPM2
+ do_fixup_by_compat_u32(blob, "fsl,cpm2-scc-uart",
+ "current-speed", bd->bi_baudrate, 1);
+
+ do_fixup_by_compat_u32(blob, "fsl,cpm2-brg",
+ "clock-frequency", bd->bi_brgfreq, 1);
+#endif
+
+ fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
+}
+#endif /* CONFIG_OF_LIBFDT */
diff --git a/cpu/mpc83xx/pci.c b/cpu/mpc83xx/pci.c
index 0defb0e..18558db 100644
--- a/cpu/mpc83xx/pci.c
+++ b/cpu/mpc83xx/pci.c
@@ -28,8 +28,7 @@
#if defined(CONFIG_OF_LIBFDT)
#include <libfdt.h>
-#elif defined(CONFIG_OF_FLAT_TREE)
-#include <ft_build.h>
+#include <fdt_support.h>
#endif
#include <asm/mpc8349_pci.h>
@@ -173,63 +172,41 @@ void mpc83xx_pci_init(int num_buses, struct pci_region **reg, int warmboot)
void ft_pci_setup(void *blob, bd_t *bd)
{
int nodeoffset;
- int err;
int tmp[2];
+ const char *path;
if (pci_num_buses < 1)
return;
- nodeoffset = fdt_path_offset(blob, "/" OF_SOC "/pci@8500");
+ nodeoffset = fdt_path_offset(blob, "/aliases");
if (nodeoffset >= 0) {
- tmp[0] = cpu_to_be32(pci_hose[0].first_busno);
- tmp[1] = cpu_to_be32(pci_hose[0].last_busno);
- err = fdt_setprop(blob, nodeoffset, "bus-range",
- tmp, sizeof(tmp));
-
- tmp[0] = cpu_to_be32(gd->pci_clk);
- err = fdt_setprop(blob, nodeoffset, "clock-frequency",
- tmp, sizeof(tmp[0]));
- }
-
- if (pci_num_buses < 2)
- return;
-
- nodeoffset = fdt_path_offset(blob, "/" OF_SOC "/pci@8600");
- if (nodeoffset >= 0) {
- tmp[0] = cpu_to_be32(pci_hose[0].first_busno);
- tmp[1] = cpu_to_be32(pci_hose[0].last_busno);
- err = fdt_setprop(blob, nodeoffset, "bus-range",
- tmp, sizeof(tmp));
-
- tmp[0] = cpu_to_be32(gd->pci_clk);
- err = fdt_setprop(blob, nodeoffset, "clock-frequency",
- tmp, sizeof(tmp[0]));
- }
-}
-#elif CONFIG_OF_FLAT_TREE
-void ft_pci_setup(void *blob, bd_t *bd)
-{
- u32 *p;
- int len;
-
- if (pci_num_buses < 1)
- return;
-
- p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len);
- if (p) {
- p[0] = pci_hose[0].first_busno;
- p[1] = pci_hose[0].last_busno;
- }
-
- if (pci_num_buses < 2)
- return;
-
- p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8600/bus-range", &len);
- if (p) {
- p[0] = pci_hose[1].first_busno;
- p[1] = pci_hose[1].last_busno;
+ path = fdt_getprop(blob, nodeoffset, "pci0", NULL);
+ if (path) {
+ tmp[0] = cpu_to_be32(pci_hose[0].first_busno);
+ tmp[1] = cpu_to_be32(pci_hose[0].last_busno);
+ do_fixup_by_path(blob, path, "bus-range",
+ &tmp, sizeof(tmp), 1);
+
+ tmp[0] = cpu_to_be32(gd->pci_clk);
+ do_fixup_by_path(blob, path, "clock-frequency",
+ &tmp, sizeof(tmp[0]), 1);
+ }
+
+ if (pci_num_buses < 2)
+ return;
+
+ path = fdt_getprop(blob, nodeoffset, "pci1", NULL);
+ if (path) {
+ tmp[0] = cpu_to_be32(pci_hose[0].first_busno);
+ tmp[1] = cpu_to_be32(pci_hose[0].last_busno);
+ do_fixup_by_path(blob, path, "bus-range",
+ &tmp, sizeof(tmp), 1);
+
+ tmp[0] = cpu_to_be32(gd->pci_clk);
+ do_fixup_by_path(blob, path, "clock-frequency",
+ &tmp, sizeof(tmp[0]), 1);
+ }
}
}
-#endif /* CONFIG_OF_FLAT_TREE */
-
+#endif /* CONFIG_OF_LIBFDT */
#endif /* CONFIG_83XX_GENERIC_PCI */