diff options
Diffstat (limited to 'arch/powerpc/kernel/prom_init.c')
-rw-r--r-- | arch/powerpc/kernel/prom_init.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index ef6f64950e9..a538824616f 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -1947,8 +1947,47 @@ static void __init fixup_device_tree_maple(void) | |||
1947 | prom_setprop(isa, name, "ranges", | 1947 | prom_setprop(isa, name, "ranges", |
1948 | isa_ranges, sizeof(isa_ranges)); | 1948 | isa_ranges, sizeof(isa_ranges)); |
1949 | } | 1949 | } |
1950 | |||
1951 | #define CPC925_MC_START 0xf8000000 | ||
1952 | #define CPC925_MC_LENGTH 0x1000000 | ||
1953 | /* The values for memory-controller don't have right number of cells */ | ||
1954 | static void __init fixup_device_tree_maple_memory_controller(void) | ||
1955 | { | ||
1956 | phandle mc; | ||
1957 | u32 mc_reg[4]; | ||
1958 | char *name = "/hostbridge@f8000000"; | ||
1959 | struct prom_t *_prom = &RELOC(prom); | ||
1960 | u32 ac, sc; | ||
1961 | |||
1962 | mc = call_prom("finddevice", 1, 1, ADDR(name)); | ||
1963 | if (!PHANDLE_VALID(mc)) | ||
1964 | return; | ||
1965 | |||
1966 | if (prom_getproplen(mc, "reg") != 8) | ||
1967 | return; | ||
1968 | |||
1969 | prom_getprop(_prom->root, "#address-cells", &ac, sizeof(ac)); | ||
1970 | prom_getprop(_prom->root, "#size-cells", &sc, sizeof(sc)); | ||
1971 | if ((ac != 2) || (sc != 2)) | ||
1972 | return; | ||
1973 | |||
1974 | if (prom_getprop(mc, "reg", mc_reg, sizeof(mc_reg)) == PROM_ERROR) | ||
1975 | return; | ||
1976 | |||
1977 | if (mc_reg[0] != CPC925_MC_START || mc_reg[1] != CPC925_MC_LENGTH) | ||
1978 | return; | ||
1979 | |||
1980 | prom_printf("Fixing up bogus hostbridge on Maple...\n"); | ||
1981 | |||
1982 | mc_reg[0] = 0x0; | ||
1983 | mc_reg[1] = CPC925_MC_START; | ||
1984 | mc_reg[2] = 0x0; | ||
1985 | mc_reg[3] = CPC925_MC_LENGTH; | ||
1986 | prom_setprop(mc, name, "reg", mc_reg, sizeof(mc_reg)); | ||
1987 | } | ||
1950 | #else | 1988 | #else |
1951 | #define fixup_device_tree_maple() | 1989 | #define fixup_device_tree_maple() |
1990 | #define fixup_device_tree_maple_memory_controller() | ||
1952 | #endif | 1991 | #endif |
1953 | 1992 | ||
1954 | #ifdef CONFIG_PPC_CHRP | 1993 | #ifdef CONFIG_PPC_CHRP |
@@ -2189,6 +2228,7 @@ static void __init fixup_device_tree_efika(void) | |||
2189 | static void __init fixup_device_tree(void) | 2228 | static void __init fixup_device_tree(void) |
2190 | { | 2229 | { |
2191 | fixup_device_tree_maple(); | 2230 | fixup_device_tree_maple(); |
2231 | fixup_device_tree_maple_memory_controller(); | ||
2192 | fixup_device_tree_chrp(); | 2232 | fixup_device_tree_chrp(); |
2193 | fixup_device_tree_pmac(); | 2233 | fixup_device_tree_pmac(); |
2194 | fixup_device_tree_efika(); | 2234 | fixup_device_tree_efika(); |