aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAnton Vorontsov <avorontsov@mvista.com>2010-06-08 05:55:50 -0400
committerKumar Gala <galak@kernel.crashing.org>2010-08-04 15:16:01 -0400
commitdee9ad718b4f0009a4170c178f7171c7b1f06f92 (patch)
treeb59f6b169881cc084bf0914e9dbe53a6964070ba /arch
parentbb863e85a74f0222f4486ddb1945ed9eb431d6c9 (diff)
powerpc/85xx: Fix booting for P1021MDS boards
P1021 processors have no dedicated ROM to store the QE microcode, so the fimrware is stored externally, and it is U-Boot responsibility to load it. It might be that the board is booting without QE, e.g. currently U-Boot doesn't support QE for P1021MDS boards, which means that QE isn't initialized, and so the board hangs early at boot. This patch fixes the issue by marking QE as disabled and checking the state in the probing code. U-Boot should fixup the state if it initialized the QE. Signed-off-by: Anton Vorontsov <avorontsov@mvista.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/boot/dts/p1021mds.dts1
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx_mds.c43
2 files changed, 38 insertions, 6 deletions
diff --git a/arch/powerpc/boot/dts/p1021mds.dts b/arch/powerpc/boot/dts/p1021mds.dts
index 7fad2df25981..ad5b85269004 100644
--- a/arch/powerpc/boot/dts/p1021mds.dts
+++ b/arch/powerpc/boot/dts/p1021mds.dts
@@ -617,6 +617,7 @@
617 bus-frequency = <0>; 617 bus-frequency = <0>;
618 fsl,qe-num-riscs = <1>; 618 fsl,qe-num-riscs = <1>;
619 fsl,qe-num-snums = <28>; 619 fsl,qe-num-snums = <28>;
620 status = "disabled"; /* no firmware loaded */
620 621
621 qeic: interrupt-controller@80 { 622 qeic: interrupt-controller@80 {
622 interrupt-controller; 623 interrupt-controller;
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
index 35ab2b42d698..9dadcffd9947 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
@@ -158,6 +158,29 @@ static int mpc8568_mds_phy_fixups(struct phy_device *phydev)
158extern void __init mpc85xx_smp_init(void); 158extern void __init mpc85xx_smp_init(void);
159#endif 159#endif
160 160
161#ifdef CONFIG_QUICC_ENGINE
162static struct of_device_id mpc85xx_qe_ids[] __initdata = {
163 { .type = "qe", },
164 { .compatible = "fsl,qe", },
165 { },
166};
167
168static void __init mpc85xx_publish_qe_devices(void)
169{
170 struct device_node *np;
171
172 np = of_find_compatible_node(NULL, NULL, "fsl,qe");
173 if (!of_device_is_available(np)) {
174 of_node_put(np);
175 return;
176 }
177
178 of_platform_bus_probe(NULL, mpc85xx_qe_ids, NULL);
179}
180#else
181static void __init mpc85xx_publish_qe_devices(void) { }
182#endif /* CONFIG_QUICC_ENGINE */
183
161static void __init mpc85xx_mds_setup_arch(void) 184static void __init mpc85xx_mds_setup_arch(void)
162{ 185{
163 struct device_node *np; 186 struct device_node *np;
@@ -218,6 +241,11 @@ static void __init mpc85xx_mds_setup_arch(void)
218 return; 241 return;
219 } 242 }
220 243
244 if (!of_device_is_available(np)) {
245 of_node_put(np);
246 return;
247 }
248
221 qe_reset(); 249 qe_reset();
222 of_node_put(np); 250 of_node_put(np);
223 251
@@ -369,8 +397,6 @@ static struct of_device_id mpc85xx_ids[] = {
369 { .type = "soc", }, 397 { .type = "soc", },
370 { .compatible = "soc", }, 398 { .compatible = "soc", },
371 { .compatible = "simple-bus", }, 399 { .compatible = "simple-bus", },
372 { .type = "qe", },
373 { .compatible = "fsl,qe", },
374 { .compatible = "gianfar", }, 400 { .compatible = "gianfar", },
375 { .compatible = "fsl,rapidio-delta", }, 401 { .compatible = "fsl,rapidio-delta", },
376 { .compatible = "fsl,mpc8548-guts", }, 402 { .compatible = "fsl,mpc8548-guts", },
@@ -382,8 +408,6 @@ static struct of_device_id p1021_ids[] = {
382 { .type = "soc", }, 408 { .type = "soc", },
383 { .compatible = "soc", }, 409 { .compatible = "soc", },
384 { .compatible = "simple-bus", }, 410 { .compatible = "simple-bus", },
385 { .type = "qe", },
386 { .compatible = "fsl,qe", },
387 { .compatible = "gianfar", }, 411 { .compatible = "gianfar", },
388 {}, 412 {},
389}; 413};
@@ -395,16 +419,16 @@ static int __init mpc85xx_publish_devices(void)
395 if (machine_is(mpc8569_mds)) 419 if (machine_is(mpc8569_mds))
396 simple_gpiochip_init("fsl,mpc8569mds-bcsr-gpio"); 420 simple_gpiochip_init("fsl,mpc8569mds-bcsr-gpio");
397 421
398 /* Publish the QE devices */
399 of_platform_bus_probe(NULL, mpc85xx_ids, NULL); 422 of_platform_bus_probe(NULL, mpc85xx_ids, NULL);
423 mpc85xx_publish_qe_devices();
400 424
401 return 0; 425 return 0;
402} 426}
403 427
404static int __init p1021_publish_devices(void) 428static int __init p1021_publish_devices(void)
405{ 429{
406 /* Publish the QE devices */
407 of_platform_bus_probe(NULL, p1021_ids, NULL); 430 of_platform_bus_probe(NULL, p1021_ids, NULL);
431 mpc85xx_publish_qe_devices();
408 432
409 return 0; 433 return 0;
410} 434}
@@ -443,12 +467,19 @@ static void __init mpc85xx_mds_pic_init(void)
443 mpic_init(mpic); 467 mpic_init(mpic);
444 468
445#ifdef CONFIG_QUICC_ENGINE 469#ifdef CONFIG_QUICC_ENGINE
470 np = of_find_compatible_node(NULL, NULL, "fsl,qe");
471 if (!of_device_is_available(np)) {
472 of_node_put(np);
473 return;
474 }
475
446 np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic"); 476 np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
447 if (!np) { 477 if (!np) {
448 np = of_find_node_by_type(NULL, "qeic"); 478 np = of_find_node_by_type(NULL, "qeic");
449 if (!np) 479 if (!np)
450 return; 480 return;
451 } 481 }
482
452 if (machine_is(p1021_mds)) 483 if (machine_is(p1021_mds))
453 qe_ic_init(np, 0, qe_ic_cascade_low_mpic, 484 qe_ic_init(np, 0, qe_ic_cascade_low_mpic,
454 qe_ic_cascade_high_mpic); 485 qe_ic_cascade_high_mpic);